首页 > 解决方案 > 我必须始终等待 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一旦过期/设置为空,然后我的应用程序就无法再从共享首选项读取/写入?

标签: flutterasynchronousasync-awaitsharedpreferencessettings

解决方案


推荐阅读