Flutter 在生成过程中调用flatter setState()或markNeedsBuild()
默认情况下,我的应用程序会打开Flutter 在生成过程中调用flatter setState()或markNeedsBuild(),flutter,flutter-hive,Flutter,Flutter Hive,默认情况下,我的应用程序会打开欢迎屏幕,在该屏幕中,我放置了检查用户是否已登录的代码。如果记录重定向到主页,则留在欢迎屏幕中,但现在返回此错误: setState() or markNeedsBuild() called during build. Null check operator used on a null value 欢迎光临。飞镖 late Box userBox; @override void initState() { super.initState(
欢迎
屏幕,在该屏幕中,我放置了检查用户是否已登录的代码。如果记录重定向到主页,则留在欢迎屏幕中,但现在返回此错误:
setState() or markNeedsBuild() called during build.
Null check operator used on a null value
欢迎光临。飞镖
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
}
}
它来自userBox.get(0)!。名称
如果我删除代码>在我的获取(0)
之后,它会说
The getter 'name' was called on null.
Receiver: null
Tried calling: name
更新2
显然,我的用户数据没有存储在我的框中(这很奇怪,因为它是第一次存储的),所以它会返回null
,但这涉及到两个问题null
我会在成功登录后保存我的用户数据,所以它应该在那里
//在登录屏幕中将数据存储在存储器中
var userData=Usermodel()
..name=user.name
..email=user.email
..createdAt=user.createdAt
..已批准=用户已批准;
final box=Hive.box(“用户”);
等待框。添加(用户数据);
即使假设它并没有在框中存储用户数据,那个么为什么我要重定向到主屏幕?(我正在检查是否为空,对吗?userBox.values.isNotEmpty&&userBox.get(0.name.toString().isNotEmpty
它不应该重定向)
在中添加条件,构建方法完成后将触发此回调
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
}
}
Box?用户框;
@凌驾
void initState(){
super.initState();
userBox=Hive.box('user');//获取用户框
if(userBox!=null){
WidgetsBinding.instance.addPostFrameCallback((){
if(userBox.values.isNotEmpty&&userBox.get(0.name.toString().isNotEmpty){
Navigator.pushreplacementname(上下文,“/home”);//如果存在,重定向到主屏幕
}
});
或
SchedulerBinding.instance.addPostFrameCallback((){
if(userBox.values.isNotEmpty&&userBox.get(0.name.toString().isNotEmpty){
Navigator.pushreplacementname(上下文,“/home”);//如果存在,重定向到主屏幕
}
});
}否则{
//导航到登录屏幕
}
}
更新
是的,如果配置单元返回null,您需要将其导航到登录屏幕。最好将userBox
创建为nullable属性
,然后检查它是否为null。如果为空,打开登录屏幕或主屏幕Hi,错误又回来了:/这次说的是对空值使用的null检查运算符
逻辑如下:1
如果我的用户登录了,你的代码工作正常2
如果我的用户还没有登录,抛出此错误<代码>代码
:用户框。获取(0)!。name
您能用stacktrace更新您的问题吗?也许你已经用Hive.box('user')设置了空值
更新了我的问题如何才能使userBox空值?在get中找到了解决方案:D而不是硬编码0
,我现在使用userBox!。keys.last
所以它总是返回最新一行的key${userBox.get(userBox.keys.last.name}
也许您在Hive.box('user')中为null。试试这个userBox.get(0)?.name??'找不到“
能否检查用户框
是否为空?如果不是,那么检查userBox的名称是否为空?@VinothVino显然是空的,但是有两个问题涉及到空1
我在成功登录后保存了我的用户数据,所以它应该在那里2
甚至说它没有在框中存储用户数据,那么我为什么要重定向到主屏幕?是的,如果配置单元返回null,则需要将其导航到登录屏幕。最好将userBox创建为可为null的属性,然后检查它是否为null。如果为空,请打开登录屏幕或主页屏幕。我已更新我的问题
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
}
}