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

Flutter NoSuchMethodError求助:LinkedSet调用[]索引失败

Flutter NoSuchMethodError: '[]' 错误修复

你遇到的NoSuchMethodError: '[]'错误,根源是**toDoList里的元素被定义成了LinkedSet(用大括号{}直接包裹的集合),而Set类型不支持通过[index]索引访问元素**。当你尝试toDoList[index][0]或toDoList[index][1]时,就会触发这个错误。

方案1:改用嵌套List存储数据

把每个待办项改成List(用方括号[]包裹),这样就能通过索引访问内容:

修改home_page.dart里的toDoList定义:

List<List<dynamic>> toDoList = [
  ["Make Tutorial", false],
  ["Do Exercise", false]
];

其余代码无需改动,原有的索引访问方式对List完全有效。

方案2:改用Map存储数据(更推荐)

用Map存储每个待办项的属性,代码可读性更强,也更易维护:

修改home_page.dart中的相关代码:

// 定义待办项的Map结构
List<Map<String, dynamic>> toDoList = [
  {"taskName": "Make Tutorial", "isCompleted": false},
  {"taskName": "Do Exercise", "isCompleted": false}
];

// 更新复选框回调方法
void checkBoxChanged(bool? value, int index){
  setState(() {
    toDoList[index]["isCompleted"] = !toDoList[index]["isCompleted"];
  });
}

// 在ListView.builder中传递参数
return TodoTile(
  taskName: toDoList[index]["taskName"],
  taskCompleted: toDoList[index]["isCompleted"],
  onChanged: (value) => checkBoxChanged(value, index),
);

这种方式不需要修改TodoTile组件,直接适配现有参数即可。

额外建议:使用自定义类(最佳实践)

如果项目规模扩大,推荐定义一个Todo类来管理待办项,类型更安全,避免动态类型的潜在问题:

// 新增todo.dart文件
class Todo {
  final String taskName;
  bool isCompleted;

  Todo({required this.taskName, this.isCompleted = false});
}

然后在home_page.dart中使用:

List<Todo> toDoList = [
  Todo(taskName: "Make Tutorial"),
  Todo(taskName: "Do Exercise")
];

void checkBoxChanged(bool? value, int index){
  setState(() {
    toDoList[index].isCompleted = !toDoList[index].isCompleted;
  });
}

// ListView.builder中传递参数
return TodoTile(
  taskName: toDoList[index].taskName,
  taskCompleted: toDoList[index].isCompleted,
  onChanged: (value) => checkBoxChanged(value, index),
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:45:53