首页 > 解决方案 > Flutter SharedPreferences getInstance 返回 null

问题描述

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

  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"

编辑:我知道我应该使用等待。但是关键字不一样?我不想再次等待所有返回的实例。另一方面,我不能在 initialRoute 中使用 await。

标签: flutterdart

解决方案


在类似情况下,我设法为我的应用程序登录用户的方式是,

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设置如下,

initialRoute: startPage,

该解决方案适用于所有场景,因为我在我的应用程序中的 runApp() 函数之前获取数据。您的应用程序在调用 runApp() 函数后呈现您的 initialPage。

这是基于从 sharedpreferences 中检索数据来管理登录页面的最佳方式,因为 SharedPreferences 需要时间来获取数据。直到从 sharedpreferences 中检索到数据,您的构建方法才完成其 UI 渲染。


推荐阅读