鴻蒙NEXT+Flutter開發(fā)7-存儲應(yīng)用設(shè)置項(xiàng)
存儲設(shè)置項(xiàng)可以讓應(yīng)用記住用戶的個性化偏好。例如,用戶可以根據(jù)自己的習(xí)慣設(shè)置應(yīng)用的主題(如亮色模式或暗色模式)、字體大小、語言等。當(dāng)用戶下次打開應(yīng)用時,這些設(shè)置能夠自動應(yīng)用,提供熟悉且舒適的使用體驗(yàn)。如果沒有存儲這些設(shè)置,用戶每次打開應(yīng)用都需要重新配置,這會極大地影響用戶體驗(yàn)。 另外,APP要上架應(yīng)用市場,在第一次下載并進(jìn)入首頁前,需要展示用戶協(xié)議和隱私政策提醒,同意之后,之后運(yùn)行就不需要提醒,這就需要記錄一下,APP是否是第一次運(yùn)行。
1.GetX與shared_preferences插件
GetX 是一個功能強(qiáng)大的 Flutter 插件,它提供了狀態(tài)管理、路由管理、依賴注入等多種功能。其主要優(yōu)勢在于簡單易用、性能高效,可以大大簡化 Flutter 應(yīng)用的開發(fā)流程。GetX插件作為一款純dart語言實(shí)現(xiàn)的插件,在鴻蒙NEXT系統(tǒng)中可以直接使用。 Flutter插件中,能夠提供存儲功能的有很多,筆者更推薦使用shared_preferences進(jìn)行簡單設(shè)置的存儲。鴻蒙NEXT社區(qū)對該插件做了適配工作,使其可以應(yīng)用于鴻蒙NEXT系統(tǒng)。
插件配置
在pubspec.yaml中添加下面的代碼,加入getx和shared_preferences的引用:
get: ^4.6.5
? shared_preferences:
? ? git:
? ? ? url: "https://gitee.com/openharmony-sig/flutter_packages.git"
? ? ? path: "packages/shared_preferences/shared_preferences"
同步插件
在終端輸入如下命令,同步新加入的插件:
flutter pub get
2.存儲功能的代碼實(shí)現(xiàn)
我們中l(wèi)ib目錄下新建common目錄,將一些常用功能實(shí)現(xiàn)放入其中。其中再新建services目錄存放服務(wù)功能,store目錄里保存存儲相關(guān)功能的文件。目錄結(jié)構(gòu)如下圖所示:

其中services.dart主要功能為導(dǎo)出所有服務(wù)項(xiàng),代碼如下:
library services;
export './storage.dart';
storage.dart提供了基礎(chǔ)的存儲服務(wù),代碼如下:
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
class StorageService extends GetxService {
? static StorageService get to => Get.find();
? late final SharedPreferences _prefs;
? Future<StorageService> init() async {
? ? _prefs = await SharedPreferences.getInstance();
? ? return this;
? }
? Future<bool> setString(String key, String value) async {
? ? return await _prefs.setString(key, value);
? }
? Future<bool> setBool(String key, bool value) async {
? ? return await _prefs.setBool(key, value);
? }
? Future<bool> setList(String key, List<String> value) async {
? ? return await _prefs.setStringList(key, value);
? }
? String getString(String key, {String def = ""}) {
? ? return _prefs.getString(key) ?? def;
? }
? bool getBool(String key, {bool def = false}) {
? ? return _prefs.getBool(key) ?? def;
? }
? List<String> getList(String key, {List<String> def = const []}) {
? ? return _prefs.getStringList(key) ?? def;
? }
? Future<bool> remove(String key) async {
? ? return await _prefs.remove(key);
? }
}
store.dart代碼如下:
library store;
export './config.dart';
config.dart提供配置項(xiàng)管理功能,代碼如下:
import 'package:get/get.dart';
import '../services/storage.dart';
class ConfigStore extends GetxController {
? static ConfigStore get to => Get.find();
? // 用戶是否第一次打開app
? static const String keyStorageIsFirstOpen = 'is_first_open';
? bool _isFirstOpen = true;
? bool get isFirstOpen => _isFirstOpen;
? // 標(biāo)記用戶已打開APP
? Future<bool> saveAlreadyOpen() {
? ? return StorageService.to.setBool(keyStorageIsFirstOpen, false);
? }
? @override
? void onInit() {
? ? super.onInit();
? ? _isFirstOpen = StorageService.to.getBool(keyStorageIsFirstOpen, def: true);
? }
}
3.存儲功能的初始化
通過上面的步驟,存儲的功能已經(jīng)實(shí)現(xiàn)了。在main.dart中,添加下面的代碼,將對存儲功能進(jìn)行初始化,以便后期調(diào)用對應(yīng)的功能。
import 'common/services/services.dart';
import 'common/store/store.dart';
Future init() async {
? WidgetsFlutterBinding.ensureInitialized();
? // 初始化存儲服務(wù)
? await Get.putAsync<StorageService>(() => StorageService().init());
? // 創(chuàng)建配置庫
? Get.put<ConfigStore>(ConfigStore());
}
void main() async {
? await init();
? runApp(const MyApp());
}
本章簡單介紹了為什么要存儲設(shè)置項(xiàng)、GetX與shared_preferences插件配置,以及存儲功能的實(shí)現(xiàn)與初始化。接下來的文章繼續(xù)結(jié)合GetX插件,利用上面的配置項(xiàng)存儲功能,實(shí)現(xiàn)用戶協(xié)議和隱私政策提醒頁面。