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 【问题描述】:

实际发生了什么?

ma​​in.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)

ma​​in.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 [重复]

使用List的addAll()方法请判空指针

List中Add()与AddAll()的区别

java进行list1.addall(list2)之后,list2是保留还是清空了?