如何在 dart 中实现具有异步初始化和 null 安全性的单例?

mid*_*007 7 singleton asynchronous dart flutter dart-null-safety

我需要一个用于共享首选项的单例,它具有异步初始化,但也适用于空安全。通常我使用以下单例实现,但是拥有空安全性的单例的最佳方法是什么?

class SharedPrefs {
static SharedPrefs _instance;
static Future<Null> _mutex;

static Future<SharedPrefs> getInstance() async {
  if (_mutex != null) {
    await _mutex;
  }
  var completer = Completer<Null>();
  _mutex = completer.future;

  if (_instance == null) {
    _instance = SharedPrefs();
    await _instance.init();
  }

  completer.complete();
  _mutex = null;

  return _instance;
}

SharedPreferences prefs;

SharedPrefs();

Future<SharedPrefs> init() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  return this;
}

dynamic get(String key) {
  return prefs.getString(key);
}

Future<bool> put(String key, dynamic value) async {
  return await prefs.setString(key,value);
}
}
Run Code Online (Sandbox Code Playgroud)

ped*_*ont 7

干得好:

class SharedPreferencesProvider {
  static SharedPreferencesProvider? _instance;
  final SharedPreferences _sharedPreferences;

  static Future<SharedPreferencesProvider> getInstance() async {
    if (_instance == null) {
      final sharedPreferences = await SharedPreferences.getInstance();
      _instance = SharedPreferencesProvider._(sharedPreferences);
    }
    return _instance!;
  }

  SharedPreferencesProvider._(SharedPreferences sharedPreferences)
      : _sharedPreferences = sharedPreferences;
Run Code Online (Sandbox Code Playgroud)