我有一个用于表单数据的单页应用程序,该应用程序获取文本和照片列表并创建一个word文档。
在查看文档列表时,我注意到所有条目都具有最近添加的值。
我正在使用这样的全局变量:
class FormData {
static String title = '';
static String procedureCovers = '';
static String department = '';
static String section = '';
static String isolationOfficer = '';
static String supervisor = '';
static String reviewer = '';
static List<dynamic> mechanicalIsolations = [];
static List<dynamic> electricalIsolations = [];
static dynamic isolationOfficersSignature;
static dynamic supervisorsSignature;
static dynamic reviewersSignature;
}
大多数表单数据工作正常,只是当我去编辑列表时。我看到了覆盖变量的问题。
我的列表元素的格式是这样的:
Map<String, dynamic> mechanicalIsolationData = {
'isolation': '',
'isolateAt': '',
'circuitValve': '',
'imageFilePath': '',
'notes': '',
};
Map<String, dynamic> electricalIsolationData = {
'isolation': '',
'isolateAt': '',
'circuitValve': '',
'notes': '',
};
我正在添加我认为是列表条目的新空白实例:
FormData.mechanicalIsolations.add(mechanicalIsolationData);
但新列表项具有上一个列表项的值。
然后,当我去设置最新列表项字段的值时,它会用新值覆盖所有列表项。我这样设置:
FormData.mechanicalIsolations[widget.listIndex]['isolation'] = text;
我已经检查了列表索引,它是正确的数字,我已经检查了它被设置为的值,它是不同的。但它仍然使用该值覆盖所有以前的列表元素。
我知道我这样做的方式是错误的,我只是不确定究竟是什么导致了它以及该怎么做才能解决它。
感谢您的帮助
虽然从您发布的代码中并不完全清楚,但问题很可能是由您的 Maps(mechanicalIsolationData
和electricalIsolationData
(是全局变量引起的。因此,当您认为使用FormData.mechanicalIsolations.add(mechanicalIsolationData);
将新的空白实例添加到 List 时,您不会添加新实例,而只是添加对 List 的引用,该引用指向同一mechanicalIsolationData
对象。稍后更改mechanicalIsolationData
Map 中的值时,所有列表元素都会更新,因为它们都指向同一对象。
长话短说:您正在重用全局变量,并不断向列表添加指向同一变量的引用,因此最终得到一个具有相同元素的列表。
为避免这种情况,请确保每次调用该方法时都实例化一个新的 Map,该方法负责填充mechanicalIsolationData
或electricalIsolationData
。喜欢这个:
addMechanicalIsolationData(String isolationValue, int isolateAtValue, String circutValveValue, String path, String notes){
Map<String, dynamic> mechanicalIsolationData = Map();
mechanicalIsolationData['isolation'] = isolationValue;
mechanicalIsolationData['isolateAt'] = isolateAtValue;
mechanicalIsolationData['circuitValve'] = circuitValveValue;
mechanicalIsolationData['imageFilePath'] = path;
mechanicalIsolationData['notes'] = notes;
mechanicalIsolations.add(mechanicalIsolationData);
}