Flutter 颤振SharedReferences getInstance返回null
尽管我在构造函数中设置了_SharedReferences,但在getUsername中它会为null。我不知道错过了什么:Flutter 颤振SharedReferences getInstance返回null,flutter,dart,Flutter,Dart,尽管我在构造函数中设置了_SharedReferences,但在getUsername中它会为null。我不知道错过了什么: class PreferencesProvider { SharedPreferences _sharedPreferences; PreferencesProvider() { SharedPreferences.getInstance().then((prefs) => _sharedPreferences = prefs); }
class PreferencesProvider {
SharedPreferences _sharedPreferences;
PreferencesProvider() {
SharedPreferences.getInstance().then((prefs) => _sharedPreferences = prefs);
}
String getUsername() {
return _sharedPreferences.getString("Username");
}
String getX() {
return _sharedPreferences.getString("X");
}
String getY() {
return _sharedPreferences.getString("Y");
}
String getZ() {
return _sharedPreferences.getString("Z");
}
}
或者,它也不起作用:
class LoginProvider {
SharedPreferences _sharedPreferences;
LoginProvider._internal();
static final LoginProvider _instance = LoginProvider._internal();
factory LoginProvider() {
_instance.initPreferences();
return _instance;
}
initPreferences() async {
_sharedPreferences = await SharedPreferences.getInstance();
}
我想在MaterialApp中使用此选项:
initialRoute: PreferencesProvider().isLoggedIn() ? "MainPage" : "LoginPage"
编辑:我知道我应该使用wait。但是关键字不一样吗?我不想再次等待实例的所有返回。另一方面,我不能在initialRoute中使用wait。您需要稍等一下,才能从共享首选项中获取用户名。getInstance是一个异步进程 下面的代码将起作用,因为
getString
将在getInstance
Future<String> getUsername() async {
_sharedPreferences = await SharedPreferences.getInstance();
return _sharedPreferences.getString("Username");
}
Future getUsername()异步{
_SharedReferences=等待SharedReferences.getInstance();
返回_sharedReferences.getString(“用户名”);
}
您需要修改您的
首选项Provider
类在使用首选项时,您应该使用未来
、等待
和异步
Future<String> getUsername() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String storeUserDetails = prefs.getString("Username");
return (storeUserDetails != null);
}
Future getUsername()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
String storeUserDetails=prefs.getString(“用户名”);
返回(storeUserDetails!=null);
}
希望这有帮助 在类似场景中,我为我的应用程序登录用户的方式是
String startPage="LoginPage";
void main() {
SharedPreferences prefs = await SharedPreferences.getInstance();
String user=prefs.getString("Username");
if(user!=null && user.length>0){
startPage="MainPage";
}
runApp(MyApp());
}
现在,按如下所示设置您的初始路线
initialRoute: startPage,
此解决方案适用于任何情况,因为我在应用程序中的runApp()函数之前获取数据。应用程序在调用runApp()函数后呈现initialPage
这是基于从SharedReferences检索数据来管理登录页面的最佳方法,因为SharedReferences获取数据需要时间。在从SharedReferences检索到数据之前,您的构建方法将完成其UI呈现。之所以需要getInstance()
,是因为getUsername
在创建类首选项Provider
后立即被调用,因此\u SharedReferences
仍然是null
(在Future给它一个值之前),或者所有其他方法(getY
、getX
和getZ
)都需要getInstance()
)?换句话说,getInstance
提供当前的数据快照,或者信息更新为\u SharedReferences
,而不再调用它?