Flutter 颤振SharedReferences getInstance返回null

Flutter 颤振SharedReferences getInstance返回null,flutter,dart,Flutter,Dart,尽管我在构造函数中设置了_SharedReferences,但在getUsername中它会为null。我不知道错过了什么: class PreferencesProvider { SharedPreferences _sharedPreferences; PreferencesProvider() { SharedPreferences.getInstance().then((prefs) => _sharedPreferences = prefs); }

尽管我在构造函数中设置了_SharedReferences,但在getUsername中它会为null。我不知道错过了什么:

  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
,而不再调用它?