【问题标题】:Flutter / Dart global variable list overwriting all list items with most recent list additionFlutter / Dart 全局变量列表用最近添加的列表覆盖所有列表项
【发布时间】:2019-09-09 03:34:39
【问题描述】:

我有一个用于表单数据的单页应用程序,它获取文本和照片列表并创建一个 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; 

我检查了列表索引,它是正确的数字,我检查了它设置的值,它是不同的。但它仍然会用该值覆盖所有先前的列表元素。

我知道我这样做的方式是错误的,我只是不确定到底是什么原因造成的,以及如何最好地解决它。

感谢您的帮助

【问题讨论】:

    标签: flutter dart global-variables


    【解决方案1】:

    虽然从您发布的代码中并不完全清楚,但问题很可能是由您的地图(mechanicalIsolationDataelectricalIsolationData)是全局变量引起的。因此,当您认为使用 FormData.mechanicalIsolations.add(mechanicalIsolationData); 将新的空白实例添加到 List 时,您不会添加新实例,只需添加对 List 的引用,它指向相同的 mechanicalIsolationData 对象。当您稍后更改 mechanicalIsolationData 映射中的值时,所有列表元素都会更新,因为它们都指向同一个对象。

    长话短说:您正在重用一个全局变量,并不断添加指向相同变量的列表的引用,因此最终得到一个具有相同元素的列表。

    为避免这种情况,请确保每次调用该方法时都实例化一个新 Map,该方法负责填充 mechanicalIsolationDataelectricalIsolationData。像这样:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-01
      • 2014-09-06
      • 2017-01-06
      • 2020-08-28
      • 2021-12-27
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多