我正在使用具有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) })
但是里面的代码永远不会执行。我尝试调试,但无法达到断点。
[不确定您如何致电集团以开始流程上传。但是,如果在按下按钮时使用bloc.add(event)
,则应以异步方式进行处理,并根据需要产生新的状态。