You need to enable JavaScript to run this app. Flutter路由跳转至TodoTasks页时整体冻结,重启程序与电脑仍无效
优惠活动
大模型
产品
解决方案
定价
更多

Flutter路由跳转至TodoTasks页时整体冻结,重启程序与电脑仍无效

问题定位

应用冻结的核心原因是TodoTasks页面列表项构建逻辑中存在无限死循环,直接阻塞了Flutter的单线程UI渲染流程,导致所有交互、渲染操作都无法执行,表现为应用完全无响应。

具体问题代码

在ListView.builder的itemBuilder回调里,你误将用于单次布尔判断的if写成了while,且循环体内没有修改循环条件的变量:

IconData _bookmark = Icons.bookmark_border;

// 错误代码
while (tasks[index].favourited == true) {
  _bookmark = Icons.bookmark;
}
while (tasks[index].favourited == false) {
  _bookmark = Icons.bookmark_border;
}

只要tasks[index].favourited的值是明确的true或者false,程序就会进入对应while循环后永远无法退出,直接卡死整个应用。

为什么未修改代码也会出现问题

这种情况通常是因为之前运行时Task类的favourited字段默认值为null,两个while的判断条件(等于true/等于false)都不成立,不会进入循环。这次启动可能因为运行状态残留、类默认值变更等原因,favourited被赋值为明确的布尔值,触发了死循环。

修复方案

将上述两个while循环替换为if判断即可,逻辑本身只需要根据favourited的值设置一次图标,不需要循环:

IconData _bookmark = Icons.bookmark_border;

// 正确代码
if (tasks[index].favourited == true) {
  _bookmark = Icons.bookmark;
}
if (tasks[index].favourited == false) {
  _bookmark = Icons.bookmark_border;
}

也可以直接简化为三元表达式,减少冗余代码:

IconData _bookmark = tasks[index].favourited ? Icons.bookmark : Icons.bookmark_border;
其他潜在优化点
  • 当前_currentIndex、_requestedPage定义在build方法内部,每次页面重建都会被重置,建议移动到State类的成员变量中。
  • 点击底部导航跳转时建议增加判断,若当前已经是目标页,无需重复执行跳转逻辑。

内容的提问来源于stack exchange,提问作者LWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 18:45:07