flutter - 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。
解决方案
在类似情况下,我设法为我的应用程序登录用户的方式是,
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 渲染。
推荐阅读
- codenameone - NPE 创建系统字体?
- codeigniter - Codeigniter Repotrs 页面的日期问题
- pdf-generation - soffice.exe 将 odt 转换为 PDF/A
- r - Loop-through-loop-through dataframe:如何提高基于另一个循环通过数据集计算结果的循环的性能
- mysql - 如何在 MYSQL 中设置列的最大值?
- git - 创建分支形式克隆的 GitHub 存储库
- java - 使用 Apache Commons 在 Groovy 中对图像文件进行 Base 64 编码
- esp32 - 有没有办法获取分配给连接到 ESP32 的新 STA 的 IP 地址及其 MAC 地址?
- node.js - MongoDB 不会使用 testcafe 测试进行更新
- c++ - 范围视图作为数据成员