Flutter(Dart)使用Tinder滑动卡片时出现cannot remove from unmodifiable list错误如何解决
问题原因解析
- Dart 中用
const修饰的列表属于编译时常量,默认被锁定了增删改操作,任何对这类常量列表本身的移除、新增、修改操作都会直接抛出cannot remove from unmodifiable list异常。 - 你在
initState中直接执行lstUsers = users赋值,本质是把状态里的lstUsers指针直接指向了外部定义的常量列表,并没有创建新的可变列表拷贝,后续调用lstUsers.removeAt()本质还是在操作那个不可修改的常量列表,自然触发报错。 - 额外说明:
initState阶段不需要套setState赋值,这个阶段是组件首次构建前的初始化逻辑,直接修改状态变量即可。
修复方案
- 修改
initState中的赋值逻辑,基于常量列表创建一个新的可变列表:
@override void initState() { super.initState(); // 用List.from基于常量列表创建新的可变列表,不再引用原常量列表 lstUsers = List.from(users); lstUsersLength = lstUsers.length; }
- 优化建议:不需要单独维护
lstUsersLength变量,直接使用lstUsers.length获取当前列表长度即可,避免两个变量更新不同步引发的额外问题,修改后的updateStack可以简化为:
void updateStack(int index) { setState(() { lstUsers.removeAt(index); }); }
内容的提问来源于stack exchange,提问作者who-aditya-nawandar
相关产品推荐
相关产品推荐

