dart - 如何使用一些初始化代码制作单例类?
问题描述
我已经尝试过这里的答案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
在方法上访问它
解决方案
您的问题是初始化是异步的。这意味着第一次访问单例实例时,该访问也需要是异步的(在初始化完成之前发生的任何进一步访问也是如此)。然而,像这样的单例的使用模式是这样的,你不知道哪个访问是第一个。所以你必须使每次访问都是异步的。
例子:
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;
}
}
推荐阅读
- android - 如何在 CameraX 上切换到前置摄像头?
- powerbi - 为什么 Power BI 报告中的所有逗号突然都替换为管道符号
- java - 使用 -Dloader.path= 运行 jar 有效,但不是 application.properties loader.path
- c - 程序启动时出现 SDL_CeateWindow 错误
- angular - 使用 TemplateRefs 对 Angular 组件进行单元测试
- curl - Facebook 正在抛出“请指定与此广告一起运行的图像”。尝试制作广告时
- aws-glue - AWS Glue:爬虫无法识别 CSV 格式的时间戳列
- android - 使用 TWA 在 Google Play 上成功发布的 PWA 有异常行为
- azure - 将消息从一条服务总线复制到另一条服务总线的最佳方法是什么?
- vue.js - Bootstrap Modal Hide from VUE 方法