我有下面的函数,应该返回SharedPreference实例:
SharedPreferences get sp {
Future<SharedPreferences> prefs = SharedPreferences.getInstance();
SharedPreferences temp;
prefs.then((value) { temp = value; });
return temp; //This is running immediately before completion and returning null
}
我有iOS背景。有DispatchGroup来帮助我们解决同样的问题:
SharedPreferences get sp {
Future<SharedPreferences> prefs = SharedPreferences.getInstance();
SharedPreferences temp;
//dispatchGroup.enter()
prefs.then((value) {
temp = value;
//dispatchGroup.leave()
});
//dispatchGroup.wait()
return temp; //This is running immediately before completion
}
我们如何使future.then((等待它完成,然后将控制权传递给下一行?在flutter中有什么类似于iOS的DispatchGroup的东西吗?
更新:
我正在寻找一种获得SharedPreferences实例的方法,以便在下面的示例中使用它:
bool get isLoggedIn => sp.getBool('IsLoggedIn');
set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);
String get userPhone => sp.getString('UserPhone');
set userPhone(String phone) => sp.setString('UserPhone', phone);
更新2
以下是迄今为止在整个应用程序中管理SharedPreferences的完整类:
class UserDefaults
{
SharedPreferences sp;
//Singleton
UserDefaults._internal();
static final UserDefaults _instance = UserDefaults._internal();
factory UserDefaults() {
_instance.initPreferences();
return _instance;
}
initPreferences() async {
sp = await SharedPreferences.getInstance();
}
/*
SharedPreferences get sp {
Future<SharedPreferences> prefs = SharedPreferences.getInstance();
SharedPreferences temp;
prefs.then((value) { temp = value; });
return temp;
}
*/
bool get isLoggedIn => sp.getBool('IsLoggedIn');
set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);
String get userPhone => sp.getString('UserPhone');
set userPhone(String phone) => sp.setString('UserPhone', phone);
}
当从main((函数调用UserDefault((.isLoggedIn时,这是不起作用的,给出了一个错误:在null上调用了"getBool"。我想这是因为initPreferences需要一些时间。
将代码放入异步函数:
SharedPreferences sp
loadPrefs() async {
sp = await SharedPreferences.getInstance();
}
bool get isLoggedIn => sp.getBool('IsLoggedIn');
set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);
String get userPhone => sp.getString('UserPhone');
set userPhone(String phone) => sp.setString('UserPhone', phone);
在init 上调用loadPrefs((
为什么不简单地使用这个:
Future<SharedPreferences> getSp() async{
return await SharedPreferences.getInstance();
}