flutter List addAll引发错误:未处理的异常:迭代过程中并发修改:

6pp0gazn  于 2023-02-13  发布在  Flutter
关注(0)|答案(3)|浏览(481)

到底发生了什么?

    • 主省道**

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)]未处理的异常:迭代过程中并发修改:"_GrowableList"的示例(长度:3). E/flutter(32313):#0列表.添加全部(dart:核心补丁/可增长阵列. dart:187:11)

    • 主省道**

这是从图库中选择图像后的代码。

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

为什么第一次成功,第二次失败?

j9per5c4

j9per5c41#

你可以这么做

_bloc.urlImageSink.add([images])

并且图像会立即反映在UI中。
我觉得问题出在这一行

capturedImagesList.addAll(_bloc.urlImageStream.value);

这看起来很奇怪,你不能把数据流复制到数组中,它不起作用.

ffvjumwh

ffvjumwh2#

你看过这个帖子吗:Exception: Concurrent modification during iteration: Instance(length:17) of '_GrowableList'
我引述这篇文章:
此错误意味着您在迭代过程中向集合添加对象或从集合中移除对象。这是不允许的,因为添加或移除项将更改集合大小并扰乱后续迭代。
所以我没有看到所有的代码,但是当你通过添加按钮添加图片时,你会清除列表或者删除当前的项目吗?

amrnrhlw

amrnrhlw3#

在执行addAll之前,尝试按如下方式清除数组

_myLeaveRequests?.clear();

相关问题