无状态 Widget 不断重建

abd*_*med 2 android state-management dart flutter statelesswidget

我目前正在按照教程开发一个待办事项应用程序,这是复选框部分

我试图将它的状态提升到树上,但是当我这样做时,无状态小部件只是不停地重建,我尝试添加key,添加const将其转换为有状态,但似乎没有任何作用,它也没有为我提供任何类型的错误或异常消息

注意:当我将onChecked设置为null时,statelessWidget 会运行两次,而它应该只构建一次。

下面是代码:

    导入“包:flutter/material.dart”;
    
    类 TaskTile 扩展 StatefulWidget {
      @覆盖
      _TaskTileState createState() => _TaskTileState();
    }
    
    类 _TaskTileState 扩展状态 {
      布尔 isChecked = false;
    
      @覆盖
      小部件构建(BuildContext上下文){
        返回列表图块(
          标题:文字(
            “完整的托多伊”,
            样式:文本样式(
                装饰: isChecked == true
                    ?TextDecoration.lineThrough
                    : TextDecoration.none),
          ),
          尾随:TaskCheckBox(
              checkBoxState: 已选中,
              切换复选框状态:
                  (布尔复选框状态){
                Future.delayed(持续时间.0,
                    () 异步 {
                  设置状态((){
                    打印(
                        “==================$isChecked==============$checkBoxState============ ================================================================================================================================================================================
                    isChecked = checkBoxState;
                  });
                });
              }),
        );
      }
    }
    
    类 TaskCheckBox 扩展 StatelessWidget {
      常量任务复选框(
          {钥匙?钥匙,
          需要 this.checkBoxState,
          需要 this.toggleCheckBoxState})
          :超级(键:键);
    
      最终布尔值checkBoxState;
      最终函数toggleCheckBoxState;
    
      @覆盖
      小部件构建(BuildContext上下文){
        打印(
            “======================================$checkBoxState+++++++++++++++++++++++++++++++++++++++++++”);
        返回复选框(
          值:复选框状态,
          更改时:
              null, // 切换CheckBoxState(checkBoxState),
        );
      }
    }


控制台输出的片段:

 
正在执行热重启...
正在将文件同步到为 x86 构建的设备 Android SDK...
我/颤振(3401):====================假==============假======== =============
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
我/颤振(3401):====================假==============假======== =============
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
我/颤振(3401):====================假==============假======== =============
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
我/颤振(3401):====================假==============假======== =============
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
我/颤振(3401):====================假==============假======== =============
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++

当onChanged设置为null时输出的片段:

在 2,694 毫秒内重新启动应用程序。
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
我/颤动(3401):=========================================假+++++++++++++++++++++++++++++++++++++++++++++


Jav*_*adi 6

setState 的目的是告诉框架状态中的变量已更改,并且需要重新构建小部件以反映该更改。因此,调用 setState 再次调用构建函数,在您的情况下,它会调用您的 Future,它再次调用 setState,从而触发构建等等。

要解决这个问题,您可以摆脱 async 函数Future.delayed,因为那里根本不需要它,也可以将 print 放在 setstate 函数之外。