颤振和块异步产量

时间:2020-03-06 05:02:44

标签: asynchronous flutter yield bloc flutter-bloc

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

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

File是文件选择器中的文件,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更新为Future<PersonalFile> upload(PersonalFile file) async { //upload code } ,并更新UI的PersonalFile的状态以显示其正在上传。

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

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

这是flutter_bloc中的mapEventToState:

mapEventToState

在此UPLOAD_FINISHED方法中,我正在等待上载方法将PersonalFile的状态更新为yield

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

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

如何编写此代码,以便如果用户在UI中按下多个“上载”按钮,则BLoC不会被阻塞(因此UI也因为BLoC无法List处于新状态)所有文件都上传了 并行但仅在每个完成之前,BLoC发送状态为PersonalFile的{​​{1}}的新UPLOAD_FINISHED

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

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

并使用:

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

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

1 个答案:

答案 0 :(得分:1)

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

还要注意,如果多次处理同一个状态,则在处理状态更改时,侦听器将仅侦听一次,因此您不会在UI中看到多个更新。

希望这会有所帮助。