Flutter Dart中将列表添加至另一列表时子列表同步更新问题求解
问题原因
- Dart 中列表属于引用类型,变量存储的是列表的内存地址而非列表本身的内容。你当前代码中所有
Model实例的list属性都指向同一个列表对象,当这个对象的内容修改时,所有引用它的地方都会同步获取到最新内容,就会出现所有子列表同步更新的现象。 - 你将
list变量定义在build方法内部,若 Widget 触发重建,list会被重新初始化为空列表,也会导致业务逻辑异常。
解决方法
修改逻辑保证每个存入全局集合的 Model 都持有独立的列表实例:
- 将
list变量从build方法移到类的成员属性位置,避免 Widget 重建时列表被重置 - 每次创建
Model实例存入全局列表时,通过List.from(list)创建当前列表的深拷贝,保证各Model的列表互不影响 - 移除无用的参数传递,精简逻辑
修改后代码
import 'package:flutter/material.dart'; import 'package:fooderlichapp/themes/models.dart'; class Display extends StatelessWidget { final TextEditingController textCont = TextEditingController(); // 列表移到类成员位置 final List<String> list = []; void add() { list.add(textCont.text); textCont.clear(); debugPrint("added text successfully"); } void addModelClass() { // 核心修改:创建列表的拷贝传入新Model final newModel = Model(name: textCont.text, list: List.from(list)); ModelClass.modelList.add(newModel); // 如果需要新增后清空当前输入列表,可放开下面的注释 // list.clear(); } void view() { var models = ModelClass.modelList; for (var model in models) { debugPrint(" ${model.list}"); } } @override Widget build(BuildContext context) { return Container( child: Scaffold( body: Column( children: [ TextField( controller: textCont, ), IconButton( onPressed: add, icon: Icon(Icons.add)), TextButton( onPressed: addModelClass, child: Text("add text")), ElevatedButton( onPressed: view, child: Text("display")) ], ), ), ); } }
模型类可同步优化规范属性定义:
class Model { final String? name; final List<String>? list; Model({this.name, this.list}); } class ModelClass { static List<Model> modelList = []; }
内容的提问来源于stack exchange,提问作者Asumah Yakubu
相关产品推荐
相关产品推荐

