等待未来.然后()完成-扑动



我有下面的函数,应该返回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();
}

最新更新