flutter and bloc异步产量

问题描述 投票:0回答:1

我正在使用具有BLoC模式的flutter(具有flutter_bloc库),并且发生了以下事件:

[PersonalFileAddedEvent(File file), PersonalFileUploadEvent(PersonalFile file)(均从PersonalFileEvent延伸)]

文件是来自文件选择器的文件,PersonalFile是具有以下枚举状态的类:READY_TO_UPLOAD, UPLOADING, UPLOAD_FINISHED

以及来自BLoC的此状态:

[PersonalFileListLoadedState(List<PersonalFile> files)(从PersonalFileListState扩展)]

[当用户选择文件时,UI调用事件PersonalFileAddedEvent,并将其传递给BLoC,后者创建PersonalFile对象并将其状态设置为READY_TO_UPLOAD。此PersonalFile对象获取添加到一个列表中,该列表包含用户正在添加(和上传)的所有PersonalFile。然后,BLoC用yield响应(PersonalFileListLoadedState(blocPersonalFileList))到UI以呈现信息。

一旦添加,将在PersonalFile的UI中呈现“立即上传”按钮。按下时,将调用PersonalFileUploadEvent事件,并将PersonalFile发送到BLoC以开始上传过程(分段上传)。收到事件后,BLoC会立即将此PersonalFile的状态更新为UPLOADING,并将yield更新为PersonalFileListLoadedState状态,并更新UI的PersonalFile的状态以显示其正在上传。

上传多部分文件的方法是异步的:

Future<PersonalFile> upload(PersonalFile file) async { //upload code }

这是flutter_bloc中的mapEventToState:

Stream<PersonalFileListState> mapEventToState(PersonalFileEvent event) async* {}

在此mapEventToState方法内部,我正在等待上载方法以将PersonalFile的状态更新为UPLOAD_FINISHED

问题现在开始,因为用户从文件选择器中添加了几个文件,并按下了所有“上传”按钮。 BLoC在收到第一个事件后被阻塞,并处理事件“ synchronous like”和UI就像在第一个完成之前未按下另一个人的PersonalFile的“上载”按钮一样(然后是下一个,依此类推)。

在一个事件得到完全处理(上载完成)之后,下一个事件得到处理,这很有意义,因为我正在等待上载方法完成。

我如何编写此代码,以便如果用户在UI中按下多个“上载”按钮,则BLoC不会被阻止(因此UI也将被阻止,因为BLoC无法yield新状态),并且所有文件上传并行执行,但直到每个BloC都将状态更改为List的新PersonalFile发送到UPLOAD_FINISHED为止。

我尝试将上载方法的签名更改为:

Stream<PersonalFile> upload(PersonalFile file) async* { //upload code }

并使用:

.then((file) { yield PersonalFileListLoadedState(listWithUpdatedPersonalFileStatus) })

但是里面的代码永远不会执行。我尝试调试,但无法达到断点。

asynchronous flutter yield bloc flutter-bloc
1个回答
0
投票

[不确定您如何致电集团以开始流程上传。但是,如果在按下按钮时使用bloc.add(event),则应以异步方式进行处理,并根据需要产生新的状态。

© www.soinside.com 2019 - 2024. All rights reserved.