maf*_*tis 1 flutter flutter-hive
我的应用程序默认打开welcome屏幕,在该屏幕中我放置了代码来检查用户是否已登录。如果记录重定向到主页,否则留在欢迎屏幕,但现在它返回此错误:
setState() or markNeedsBuild() called during build.
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个错误吗?
如果我的用户已经登录,Vinoth Vino答案工作正常,但如果我的用户未登录,则会抛出此错误:
Null check operator used on a null value
Run Code Online (Sandbox Code Playgroud)
哪个来自 userBox.get(0)!.name
如果我!在我之后删除get(0)然后它说
The getter 'name' was called on null.
Receiver: null
Tried calling: name
Run Code Online (Sandbox Code Playgroud)
显然我的用户数据没有存储在我的盒子中(这很奇怪,因为它确实是第一次存储),所以它正在返回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);
Run Code Online (Sandbox Code Playgroud)
userBox.values.isNotEmpty && userBox.get(0).name.toString().isNotEmpty它不应该重定向)在addPostFrameCallback()中添加条件,一旦 build 方法完成,就会触发此回调。
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
}
}
Run Code Online (Sandbox Code Playgroud)
更新
是的,如果配置单元返回 null,您需要将其导航到登录屏幕。最好创建userBoxasnullable property然后检查它是否为空。如果为空,则打开登录屏幕或主屏幕
| 归档时间: |
|
| 查看次数: |
3990 次 |
| 最近记录: |