List addAll throw error :Unhandled Exception: 迭代期间并发修改:
Posted
技术标签:
【中文标题】List addAll throw error :Unhandled Exception: 迭代期间并发修改:【英文标题】:List addAll throw error :Unhandled Exception: Concurrent modification during iteration: 【发布时间】:2020-05-08 23:05:06 【问题描述】:实际发生了什么?
main.dart
在initState
中,我们正在调用服务器从数据库中获取图像,然后将其添加到接收器中
var capturedImagesList = List<dynamic>();
@override
void initState()
super.initState();
_bloc.getImages(); //
);
集团类
final _urlImage = BehaviorSubject<List<dynamic>>();
get urlImageSink => _urlImage.sink;
get urlImageStream => _urlImage.stream;
Future getImages() async
Response image = await _repo.getImages(); // call server
var imageResponse = Response.fromJson(image.body);
urlImageSink.add(imageResponse.images); // add image to sink
检索到的图片会横向显示ListView
。
当点击+图片时,它会允许用户从图库中选择一张图片,然后放在ListView
旁边,如下图。
一切正常!
但是当我再次单击 + 图像以添加更多图像时,它会抛出这个错误
[错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常: 迭代中并发修改:Instance(length:3) of '_GrowableList'。 E/颤振(32313):#0 List.addAll (dart:core-patch/growable_array.dart:187:11)
main.dart
这是从图库中选择图像后的代码。
@override
List<dynamic> userImage(File images)
if (images != null)
capturedImagesList.add(images.path); // add selected image to List
capturedImagesList.addAll(_bloc.urlImageStream.value); // add the server image to list
_bloc.urlImageSink.add(capturedImagesList); // add all images to list
return null;
错误指向这一行
capturedImagesList.addAll(_bloc.urlImageStream.value);
为什么第一次成功,第二次失败了?
【问题讨论】:
你找到解决办法了吗? @rajithShetty 是的 @JohnJoe 解决方案是什么? @AjayGautam 我在最后使用 for 循环。 【参考方案1】:你可以这样做
_bloc.urlImageSink.add([images])
并且图像会立即反映在 UI 中。
我认为问题出在这一行
capturedImagesList.addAll(_bloc.urlImageStream.value);
这看起来很奇怪,你不能将流复制到数组中,它不起作用。
【讨论】:
【参考方案2】:您是否查看过这个帖子:Exception: Concurrent modification during iteration: Instance(length:17) of '_GrowableList'
我引用这篇文章:
此错误表示您在迭代期间从集合中添加或删除对象。这是不允许的,因为添加或删除项目会改变集合大小并扰乱后续迭代。
所以我没有看到所有的代码,但是当您通过添加按钮添加图片时,您会清除列表或删除当前项目吗?
【讨论】:
以上是关于List addAll throw error :Unhandled Exception: 迭代期间并发修改:的主要内容,如果未能解决你的问题,请参考以下文章
list.addAll()是浅拷贝,如何实现list的深拷贝
list.addAll()是浅拷贝,如何实现list的深拷贝
List.addAll 在尝试添加另一个列表时抛出 UnsupportedOperationException [重复]