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
相关产品推荐
相关产品推荐

