You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中CheckboxListTile无法勾选问题求助

解决CheckboxListTile无法切换勾选状态的问题

问题根源

你当前的代码存在两个核心问题:

  1. 每次ListView.builder构建列表项时,都会把局部变量isChecked重新初始化为false,哪怕在onChanged里修改了这个变量,下次组件重建时又会被重置,导致勾选状态永远无法保留。
  2. 没有将Checkbox的状态与数据源checkListItems中的value字段绑定,状态没有持久化到数据源中,组件重建后自然回到初始状态。

修正方案

直接把CheckboxListTile的状态绑定到数据源的value字段,在勾选变化时更新数据源,同时同步维护选中项列表。

修正后的完整代码

状态变量部分:

List selectedItemsList = [];
List checkListItems = [
  {
    "id": 0,
    "value": false,
    "title": "Sunday",
  },
  {
    "id": 1,
    "value": false,
    "title": "Monday",
  },
];

UI部分:

Center(
  child: Padding(
    padding: const EdgeInsets.all(10),
    child: ListView.builder(
      itemCount: checkListItems.length,
      itemBuilder: (BuildContext context, int index) {
        // 直接从数据源读取当前项的勾选状态
        bool isChecked = checkListItems[index]['value'] as bool;
        return CheckboxListTile(
          title: Text(checkListItems[index]['title'].toString()),
          selected: isChecked,
          value: isChecked,
          onChanged: (value) {
            setState(() {
              // 更新数据源里的状态字段
              checkListItems[index]['value'] = value;
              // 同步维护选中项列表
              final currentItem = checkListItems[index];
              if (value == true) {
                if (!selectedItemsList.contains(currentItem)) {
                  selectedItemsList.add(currentItem);
                }
              } else {
                selectedItemsList.remove(currentItem);
              }
            });
          },
        );
      },
    ),
  ),
)

说明

  • 现在每次勾选状态变化都会直接更新数据源,组件重建时会从数据源读取最新状态,勾选状态就能正常切换并保留了。
  • 将selectedItemsList的维护逻辑放在setState内部,保证了UI状态和数据的同步,避免出现数据不一致的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:41:11