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):=========================================假+++++++++++++++++++++++++++++++++++++++++++++
setState 的目的是告诉框架状态中的变量已更改,并且需要重新构建小部件以反映该更改。因此,调用 setState 再次调用构建函数,在您的情况下,它会调用您的 Future,它再次调用 setState,从而触发构建等等。
要解决这个问题,您可以摆脱 async 函数Future.delayed,因为那里根本不需要它,也可以将 print 放在 setstate 函数之外。
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |