flutter - shared_preferences 对现有值返回 null
问题描述
我正在尝试查看我的应用程序的 shared_pereferences 中是否有可用的 id 密钥,如果有,请将我的用户重定向到主页。我正在检查 main.dart 的 initState() 函数中的 ID,并且我知道该 ID 存在,因为我可以在其他页面中获取它。但在我的 main.dart 中它返回 null。有任何想法吗?这是我的 main.dart 代码:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import './ui/pages/auth/auth_one.dart';
import './ui/pages/main_page.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitDown, DeviceOrientation.portraitUp])
.then((_) => runApp(MyApp()));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String userId;
@override
void initState() {
_getUserId().then((id) => userId = id);
super.initState();
}
@override
Widget build(BuildContext context) {
print(userId);
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.deepPurple),
debugShowCheckedModeBanner: false,
home: userId == null ? AuthOne() : MainPage(),
);
}
_getUserId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var id = prefs.getString('id');
return id;
}
}
解决方案
您的_getUserId
方法是异步的,因此您必须在获得结果后刷新小部件。
用这个:
@override
void initState() {
_getUserId().then((id) {
//calling setState will refresh your build method.
setState(() {
userId = id;
});
});
super.initState();
}
推荐阅读
- apache-spark - 大量窗口函数和非常大的数据集上的 Spark 性能问题
- c - 如何在c中递归列出目录的所有文件
- java - PreparedStatements 的正则表达式
- java - 在骆驼路线中实现计数器变量
- angular - Angular Material:当此值为对象时,Mat-select 不会获取所选表单的值
- android - 更改底部导航的图标位置
- mongodb - MongoDB多个集合或多个数据库
- typescript - 根据内部数组的值过滤对象数组
- linux - 仅在标题中带有关键字“mono”的文件上尝试在文件夹中使用 dpkg
- android - 有没有办法在没有活动的情况下使用 Viewpager 实现 TabLayout?