Flutter Null 安全配置 Class 和 shared_preferences
Flutter Null Safe Config Class with shared_preferences
在flutter1.x中,我使用Fluttershared_preferences包实现了一个Configclass;代码如下所示:
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 异步的 class 方法然后重新创建变量。同时,如果不先初始化它,我不能将它创建为 class 变量。有人可以告诉我一个更干净的方法来做到这一点,还是我每次使用它时都必须重新声明它?
另外,如何在其他 classes 中初始化配置对象?在我的 1.x 代码中,我会这样做:
final Config config = new Config();
然后开始访问配置对象的属性。我现在如何使用 class 中的所有异步代码初始化它?
这是今天更新的代码:
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);
}
}
如果在获取 class 的实例之前需要等待一些异步工作完成,请考虑使用静态方法(而不是 factory
构造函数,因为构造函数必须始终 return 基本类型)。
您可以使用 late
字段在初始化它们之前允许它们为非空:
class Config {
late String _accessToken;
String get accessToken => _accessToken;
Config._(); // private constructor to prevent accidental creation
static Future<Config> create() async {
final config = Config();
final preferences = await SharedPreferences.getInstance();
config._accessToken = await preferences.getString('<your key>');
return config;
}
}
如果您想确保它在 运行 您的应用程序之前初始化,您可以在 main()
方法中初始化它,然后再调用 runApp()
将控制权交给 Flutter 框架:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); // make sure all plugins loaded etc.
final config = await Config.create();
print(config.accessToken);
runApp(MyApp());
}
您可以在 init
方法中将 SharedPreferences
的实例作为静态字段获取:
static SharedPreferences? _prefs; //or: static late SharedPreferences _prefs;
static init() async {
_prefs = await SharedPreferences.getInstance();
}
然后在第一个小部件 运行 的 build()
方法中的某处调用 init()
,对于 once.Now,您可以根据需要在任何地方使用 _prefs
。
如果我想给你看一个完整的class来使用SharedPreferences
,它看起来像这样:
import 'package:shared_preferences/shared_preferences.dart';
class SharedPreferencesRepository {
static SharedPreferences? _prefs;
static init() async {
_prefs = await SharedPreferences.getInstance();
}
static putInteger(String key, int value) {
if (_prefs != null) _prefs!.setInt(key, value);
}
static int getInteger(String key) {
return _prefs == null ? 0 : _prefs!.getInt(key) ?? 0;
}
static putString(String key, String value) {
if (_prefs != null) _prefs!.setString(key, value);
}
static String getString(String key) {
return _prefs == null ? 'DEFAULT_VALUE' : _prefs!.getString(key) ?? "";
}
static putBool(String key, bool value) {
if (_prefs != null) _prefs!.setBool(key, value);
}
static bool getBool(String key) {
return _prefs == null ? false : _prefs!.getBool(key) ?? false;
}
}
希望对你有用。
在flutter1.x中,我使用Fluttershared_preferences包实现了一个Configclass;代码如下所示:
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 异步的 class 方法然后重新创建变量。同时,如果不先初始化它,我不能将它创建为 class 变量。有人可以告诉我一个更干净的方法来做到这一点,还是我每次使用它时都必须重新声明它? 另外,如何在其他 classes 中初始化配置对象?在我的 1.x 代码中,我会这样做:
final Config config = new Config();
然后开始访问配置对象的属性。我现在如何使用 class 中的所有异步代码初始化它?
这是今天更新的代码:
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);
}
}
如果在获取 class 的实例之前需要等待一些异步工作完成,请考虑使用静态方法(而不是 factory
构造函数,因为构造函数必须始终 return 基本类型)。
您可以使用 late
字段在初始化它们之前允许它们为非空:
class Config {
late String _accessToken;
String get accessToken => _accessToken;
Config._(); // private constructor to prevent accidental creation
static Future<Config> create() async {
final config = Config();
final preferences = await SharedPreferences.getInstance();
config._accessToken = await preferences.getString('<your key>');
return config;
}
}
如果您想确保它在 运行 您的应用程序之前初始化,您可以在 main()
方法中初始化它,然后再调用 runApp()
将控制权交给 Flutter 框架:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); // make sure all plugins loaded etc.
final config = await Config.create();
print(config.accessToken);
runApp(MyApp());
}
您可以在 init
方法中将 SharedPreferences
的实例作为静态字段获取:
static SharedPreferences? _prefs; //or: static late SharedPreferences _prefs;
static init() async {
_prefs = await SharedPreferences.getInstance();
}
然后在第一个小部件 运行 的 build()
方法中的某处调用 init()
,对于 once.Now,您可以根据需要在任何地方使用 _prefs
。
如果我想给你看一个完整的class来使用SharedPreferences
,它看起来像这样:
import 'package:shared_preferences/shared_preferences.dart';
class SharedPreferencesRepository {
static SharedPreferences? _prefs;
static init() async {
_prefs = await SharedPreferences.getInstance();
}
static putInteger(String key, int value) {
if (_prefs != null) _prefs!.setInt(key, value);
}
static int getInteger(String key) {
return _prefs == null ? 0 : _prefs!.getInt(key) ?? 0;
}
static putString(String key, String value) {
if (_prefs != null) _prefs!.setString(key, value);
}
static String getString(String key) {
return _prefs == null ? 'DEFAULT_VALUE' : _prefs!.getString(key) ?? "";
}
static putBool(String key, bool value) {
if (_prefs != null) _prefs!.setBool(key, value);
}
static bool getBool(String key) {
return _prefs == null ? false : _prefs!.getBool(key) ?? false;
}
}
希望对你有用。