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
      }
    }