在整个项目中总是需要SharedPreferences对象,但是我们得到的数据像SharedPreferences _prefs = await SharedPreferences.getInstance();
因此,我们想始终使用await
,这就是为什么我认为为SharedPreferences创建Singleton类并为SharedPreferences中的GET&SET数据创建静态方法的原因。
使用这种类型的功能,我们可以编写可重用的代码,并 提高生产力
帮我创建Singleton类
答案 0 :(得分:7)
对于句柄单例类SharedPreference
,请遵循3个步骤
-
1。将此类放在您的项目中
import 'dart:async' show Future;
import 'package:shared_preferences/shared_preferences.dart';
class PreferenceUtils {
static Future<SharedPreferences> get _instance async => _prefsInstance ??= await SharedPreferences.getInstance();
static SharedPreferences _prefsInstance;
// call this method from iniState() function of mainApp().
static Future<SharedPreferences> init() async {
_prefsInstance = await _instance;
return _prefsInstance;
}
static String getString(String key, [String defValue]) {
return _prefsInstance.getString(key) ?? defValue ?? "";
}
static Future<bool> setString(String key, String value) async {
var prefs = await _instance;
return prefs?.setString(key, value) ?? Future.value(false);
}
}
2。从您的主类的initState()初始化该类
PreferenceUtils.init();
3。访问您的方法,例如
PreferenceUtils.setString(AppConstants.USER_NAME, "");
String username = PreferenceUtils.getString(AppConstants.USER_NAME);
答案 1 :(得分:1)
这是我的首选解决方案:
class Storage {
static const String _some_field = 'some_field';
static Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
static Future<String> getSomeStringData() async =>
(await prefs).getString(_some_field) ?? '';
static Future setSomeStringData(String phone) async =>
(await prefs).setString(_some_field, phone);
static Future clear() async {
await getSomeStringData(null);
}
}
答案 2 :(得分:0)
我将此代码用于单例设置
static Future<SharedPreferences> getInstance() async
{
SharedPreferences preferences ;
preferences = await SharedPreferences.getInstance();
return preferences;
}
然后使用它来还原您的数据,这里我还原userId。
/// ----------------------------------------------------------
/// Method that saves/restores the userId
/// ----------------------------------------------------------
static Future<String> getUserId() async {
return getInstance().then((pref) {
return pref.get(Constants.userId);
});
}
希望它会有所帮助:)
答案 3 :(得分:0)
class YourClass {
static final YourClass _singleton =
new YourClass._internal();
factory YourClass(){
return _singleton;
}
YourClass._internal(){
//initialization your logic here
}
}
//主代码环境
YourClass mClass = new YourClass(); //把单身人士找回来
答案 4 :(得分:0)
您可以使用以下非常简单的类来获取没有 SharedPreferences
的 await
实例:
import 'package:shared_preferences/shared_preferences.dart';
class SharedPrefs {
static late final SharedPreferences instance;
static Future<SharedPreferences> init() async =>
instance = await SharedPreferences.getInstance();
}
instance
可能在 main()
函数中,如下所示:void main() async {
// Required for async calls in `main`
WidgetsFlutterBinding.ensureInitialized();
// Initialize SharedPrefs instance.
await SharedPrefs.init();
runApp(MyApp());
}
SharedPrefs.instance
上的访问方法,例如:final someString = SharedPrefs.instance.getString('someString') ?? 'defaultValue';
await SharedPrefs.instance.setBool('someBool', true);
额外:
如果愿意,可以通过重新定义这些方法(getBool
、setString
等)或定义新方法(getUser
、setUser
、setAccessToken
等)来进一步抽象.) 在 SharedPrefs
类本身中,并使 instance
成为像 _instance
这样的私有字段。
一个这样的例子如下:
// Getter
static bool? getBool(String key) => _instance.getBool(key);
// Setter
static Future<bool> setBool(String key, bool value) => _instance.setBool(key, value);
// More abstraction
static const _kAccessToken = 'accessToken';
static Future<bool> setAccessToken(String value) => _instance.setString(_kAccessToken, value);
static String? getAccessToken() => _instance.getString(_kAccessToken);
之后,可以简单地调用这些方法,如下所示:
final someBool = SharedPrefs.getBool('someBool') ?? false;
await SharedPrefs.setBool('someBool', someBool);
final accessToken = SharedPrefs.getAccessToken();