在 Flutter 1.x 中,我使用 Flutter shared_preferences 包实现了一个 Config 类;代码如下所示:
import 'package:shared_preferences/shared_preferences.dart';
class Config {
static final Config _config = Config._internal();
factory Config() => _config;
final accessTokenKey = 'accessToken';
String _accessToken;
SharedPreferences prefs;
Config._internal() {
loadData();
}
void loadData() async {
prefs = await SharedPreferences.getInstance();
_accessToken = prefs.getString(accessTokenKey) ?? '';
}
String get accessToken {
return _accessToken;
}
set accessToken(String accessToken) {
_accessToken = accessToken;
_saveString(accessTokenKey, accessToken);
}
_saveString(String key, String value, {String printValue = ''}) {
String printVal = printValue.length > 0 ? printValue : value;
prefs.setString(key, value);
}
}
我正在 Flutter 2.x 中创建一个新项目并尝试使用相同的代码,但由于与 null 安全性相关的更改,我在正确更新代码时遇到了一些困难。包的更新文档说要像这样初始化 _prefs 对象:
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
然后使用以下命令创建一个本地首选项对象:
final SharedPreferences prefs = await _prefs;
这很好,但我不想让每个使用 shared_preferences 的类方法异步然后重新创建变量。同时,如果不先初始化它,我就无法将它创建为类变量。有人可以告诉我一个更清洁的方法来做到这一点,还是我每次使用它时都必须重新声明它?另外,如何在我的其他类中初始化配置对象?在我的 1.x 代码中,我会这样做:
final Config config = new Config();
然后开始访问配置对象的属性。我现在如何使用类中的所有异步代码对其进行初始化?
这是今天更新代码的位置:
import 'package:shared_preferences/shared_preferences.dart';
import '../models/device.dart';
class Config {
static final Config _config = Config._internal();
factory Config() => _config;
final accessTokenKey = 'accessToken';
String _accessToken = '';
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Config._internal() {
print('Config constructor');
loadData();
}
Future<void> loadData() async {
final SharedPreferences prefs = await _prefs;
_accessToken = prefs.getString(accessTokenKey) ?? '';
}
String get accessToken {
return _accessToken;
}
set accessToken(String accessToken) {
_accessToken = accessToken;
_saveString(accessTokenKey, accessToken);
}
_saveString(String key, String value, {String printValue = ''}) {
String printVal = printValue.length > 0 ? printValue : value;
print('Config: _saveString("$key", "$printVal")');
final SharedPreferences prefs = await _prefs;
prefs.setString(key, value);
}
}