首页 > 解决方案 > 如何使用一些初始化代码制作单例类?

问题描述

我已经尝试过这里的答案How do you build a Singleton in Dart?

但我无法实现我想要的。所以基本上我想将共享首选项服务作为单例类。目前我的代码是这样的。这只是一个普通的班级,而不是单身人士。

class SharedPreferenceService {
  late SharedPreferences _prefs;

  SharedPreferenceService() {
    SharedPreferences.getInstance().then((value) => _prefs = value);
  }

  Future<void> setIntroPagesHaveBeenViewed() async {
    await _prefs.setBool(SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED, true);
  }

  Future<bool> checkIfIntroPagesHaveBeenViewed() async {
    return _prefs.getBool(SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED) ?? false;
  }
}

我需要一个单例类,但是当第一次初始化实例时,我还需要初始化 _pref,所以我可以_pref在方法上访问它

标签: dart

解决方案


您的问题是初始化是异步的。这意味着第一次访问单例实例时,该访问也需要是异步的(在初始化完成之前发生的任何进一步访问也是如此)。然而,像这样的单例的使用模式是这样的,你不知道哪个访问是第一个。所以你必须使每次访问都是异步的。

例子:

class SharedPreferenceService {
  static final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  Future<void> setIntroPagesHaveBeenViewed() async {
    await (await _prefs).setBool(
        SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED, true);
  }

  Future<bool> checkIfIntroPagesHaveBeenViewed() async {
    return (await _prefs).getBool(
        SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED) ?? false;
  }
}

如果无论如何所有方法都是异步的,那么额外的延迟不会成为问题。

如果你真的,真的只想await在绝对必要的情况下做额外的事情,你可以缓存这个值,就像你在这里尝试的那样:

class SharedPreferenceService {
  static final Future<SharedPreferences> _prefsFuture = SharedPreferences.getInstance();
  static SharedPreferences? _prefs;

  Future<void> setIntroPagesHaveBeenViewed() async {
    var prefs = _prefs ??= await _prefsFuture;
    await _prefs.setBool(
        SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED, true);
  }

  Future<bool> checkIfIntroPagesHaveBeenViewed() async {
    var prefs = _prefs ??= await _prefsFuture;
    return _prefs.getBool(
        SharedPreferenceKey.INTRODUCTION_PAGES_HAVE_BEEN_VIEWED) ?? false;
  }
}

推荐阅读