如何解决在构建期间调用 Flutter setState() 或 markNeedsBuild()
我的应用默认打开 welcome
屏幕,我在该屏幕中放置了代码来检查用户是否已登录。如果登录重定向到主页否则留在欢迎屏幕但现在它返回此错误:
setState() or markNeedsBuild() called during build.
welcome.dart
late Box userBox;
@override
void initState() {
super.initState();
userBox = Hive.Box<usermodel>('user'); // get user Box
// see if user data exist in storage or not?
if(userBox.values.isNotEmpty && userBox.get(0).name.toString().isNotEmpty) {
Navigator.pushReplacementNamed(context,'/home'); // if exist redirect to home screen
}
}
更新
如果我的用户已登录 Vinoth Vino
答案工作正常,但如果我的用户未登录,则会抛出此错误:
Null check operator used on a null value
来自userBox.get(0)!.name
如果我在 !
之后删除 get(0)
那么它会说
The getter 'name' was called on null.
Receiver: null
Tried calling: name
更新 2
显然我的用户数据没有存储在我的盒子里(这很奇怪,因为它第一次存储了)所以它返回了 null
,但是有两个问题涉及到 null
>
//store data in storage in login screen
var userData = usermodel()
..name = user.name
..email = user.email
..createdAt = user.createdAt
..approved = user.approved;
final Box = Hive.Box<usermodel>('user');
await Box.add(userData);
- 甚至可以说它没有将用户数据存储在框中,那我为什么要重定向到主屏幕? (我正在检查无效性对吗?
userBox.values.isNotEmpty && userBox.get(0).name.toString().isNotEmpty
它不应该重定向)
解决方法
在 addPostFrameCallback() 中添加条件,构建方法完成后将触发此回调。
Box? userBox;
@override
void initState() {
super.initState();
userBox = Hive.box<Usermodel>('user'); // get user box
if (userBox != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if(userBox.values.isNotEmpty && userBox.get(0).name.toString().isNotEmpty) {
Navigator.pushReplacementNamed(context,'/home'); // if exist redirect to home screen
}
});
or
SchedulerBinding.instance.addPostFrameCallback((_) {
if(userBox.values.isNotEmpty && userBox.get(0).name.toString().isNotEmpty) {
Navigator.pushReplacementNamed(context,'/home'); // if exist redirect to home screen
}
});
} else {
// Navigate to login screen
}
}
更新
是的,如果 hive 返回 null,您需要将其导航到登录屏幕。最好将 userBox
创建为 nullable property
然后检查它是否为空。如果为空,则打开登录屏幕或主屏幕
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。