flutter - 我必须始终等待 Flutter Shared Preferences 吗?
问题描述
我有一个关于 shared_preferences 插件的问题,关于每次我想读/写时是否必须执行异步操作。
首先,我将发布一部分代码,我在观看有关 shared_preferences 插件的教程时编写了这些代码。如您所见,我想要持久化的值的每个 get/set 方法都是异步的,因此必须在调用代码中等待:
//SINGLETON
class SharedPrefsHelper {
//SINGLETON pattern https://stackoverflow.com/questions/12649573/how-do-you-build-a-singleton-in-dart
static final SharedPrefsHelper _sharedPrefsHelper = SharedPrefsHelper._internal();
factory SharedPrefsHelper() => _sharedPrefsHelper; //factory Constructor
SharedPrefsHelper._internal();
//end of SINGLETON pattern
SharedPreferences _prefs;
_initPrefs() async {
if (_prefs == null) _prefs = await SharedPreferences.getInstance();
}
//appLanguage
setAppLanguage(String value) async {
await _initPrefs();
_prefs.setString(SharedPrefsKeys._appLanguage, value);
}
Future<String> getAppLanguage(BuildContext context) async {
await _initPrefs();
String value = _prefs.getString(SharedPrefsKeys._appLanguage);
if (value == null) {
value = 'english'; //default value
setAppLanguage(value);
}
return value; //String gets returned directly because of the await
}
//...
现在,我将发布该代码的略微修改版本。这里最大的区别是我不会initPrefs()
在每个 getter/setter 中调用该方法,因此它们不必是异步的。在这种情况下,initPrefs() 方法在我的 Widget 树的顶部
被调用一次。
我想试试这个,因为我不想总是在从我的共享首选项中读取/写入值时。FutureBuilder
await
//SINGLETON
class SharedPrefsHelper {
//SINGLETON pattern https://stackoverflow.com/questions/12649573/how-do-you-build-a-singleton-in-dart
static final SharedPrefsHelper _sharedPrefsHelper = SharedPrefsHelper._internal();
factory SharedPrefsHelper() => _sharedPrefsHelper; //factory Constructor
SharedPrefsHelper._internal();
//end of SINGLETON pattern
SharedPreferences _prefs;
Future<void> initPrefs() async {
if (_prefs == null) _prefs = await SharedPreferences.getInstance();
}
//appLanguage
setAppLanguage(String value) {
_prefs.setString(SharedPrefsKeys._appLanguage, value);
}
String getAppLanguage(BuildContext context) {
String value = _prefs.getString(SharedPrefsKeys._appLanguage);
if (value == null) {
value = 'english'; //default value
setAppLanguage(value); //no need to await this
}
return value;
}
我的问题是,第二个实现是否有任何缺点,我不必等待每次读/写?
换句话说,单例对象中的_prefs
属性是否有可能SharedPrefsHelper
一旦过期/设置为空,然后我的应用程序就无法再从共享首选项读取/写入?
解决方案
推荐阅读
- spring - Eclipselink / Spring Boot 与 Gradle。为 QueryDslPredicateExecutor 获取 ClassNotFoundException
- python - 使用 Python Plotly 自定义 Networkx 图(或 Scatter)
- ios - SKSpriteNode 使用 PDF/SVG 矢量图像进行自动缩放
- django - 我怎样才能在 django 上使 Emailfield 不区分大小写?
- android - transformClassesAndResourcesWithProguardForRelease
- visual-studio-code - 如何关闭 vscode 的搜索开关?
- python - 在 PyQt 中不能调用 QThread
- python - 如何仅在括号内拆分或切片所有内容并仍然循环?
- scala - 如何在 Scala 中生成可变单位矩阵?
- wpf - Wpf ComboBox SelectedItem 不适用于 dynamicProxy