我有一个错误:" ConcurrentModificationError" - 打破异常:迭代期间的并发修改:' ObservableList'的实例。
当我想在" ForEach"期间删除ObservableList的一些项目。习惯于搜索"项目
代码示例:
html的
<template repeat="{{f in SelectedFiles}}">
<li>
<span class="label">{{f.name}}"">
<button class="tiny" on-click="{{deleteDataSetFile}}" data-file="{{f.path}}">Delete</button>
</li>
</template>
.dart
@observable List<String> fileSelected;
void deleteDataSetFile(Event event, var detail, var target) {
String datafile = target.attributes['data-file'];
for(var file in this.SelectedFiles){
if(file.path==datafile){
this.SelectedFiles.remove(file);
}
}
}
答案 0 :(得分:1)
解决方案“。dart”
@observable List<String> fileSelected;
void deleteDataSetFile(Event event, var detail, var target) {
String datafile = target.attributes['data-file'];
var tmp;
for(var file in this.SelectedFiles){
if(file.path==datafile){
tmp = file;
}
}
if(tmp!=null){
this.SelectedFiles.remove(tmp);
}
}
答案 1 :(得分:1)
这在大多数编程语言中都不起作用。
解决方法:
遍历列表的副本
@observable List<String> fileSelected;
void deleteDataSetFile(Event event, var detail, var target) {
String datafile = target.attributes['data-file'];
for(var file in this.SelectedFiles.toList()){ // added .toList() which returns a copy
if(file.path==datafile){
this.SelectedFiles.remove(file);
}
}
}
存储元素并稍后将其删除
@observable List<String> fileSelected;
void deleteDataSetFile(Event event, var detail, var target) {
String datafile = target.attributes['data-file'];
List<String> itemsToRemove = [];
for(var file in this.SelectedFiles){
if(file.path==datafile){
itemsToRemove.add(file);
}
}
for(var file in itemsToRemove) {
this.SelectedFiles.remove(file);
}
}
如果你以不同的方式迭代,你可以在迭代时删除
for(int i = 0; i < this.SelectedFiles.length;){
if(file.path==datafile){
this.SelectedFiles.removeAt(i)
} else {
i++;
}
}
或使用List
this.SelectedFiles.retainWhere((e) => e.path != dataFile);
this.SelectedFiles.removeWhere((e) => e.path == dataFile);