我正在使用带有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) })
但是里面的代码永远不会执行。我尝试调试,但无法达到断点。
答案 0 :(得分:1)
不确定您如何呼叫集团来开始流程上传。
但是,如果在按下按钮时使用bloc.add(event)
,则应该以异步方式对其进行处理,并根据需要产生新的状态。
还要注意,如果多次处理同一个状态,则在处理状态更改时,侦听器将仅侦听一次,因此您不会在UI中看到多个更新。
希望这会有所帮助。