我正在使用带有 BLoC 模式的颤振(使用 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,该 BLoC 创建一个PersonalFile
对象并将其状态设置为READY_TO_UPLOAD
. 该PersonalFile
对象被添加到包含用户正在添加(和上传)的所有 PersonalFile 的列表中。然后 BLoC 向 UI 响应 ( yield
)PersonalFileListLoadedState(blocPersonalFileList)
以呈现信息。
添加后,“立即上传”按钮将在 UI 中呈现PersonalFile
。按下时,这会调用PersonalFileUploadEvent
事件并将 发送PersonalFile
到 BLoC 以启动上传过程(分段上传)。接收到事件后,BLoC 立即更新此 PersonalFile 的状态,UPLOADING
并为 UI 更新 PersonalFileyield
的PersonalFileListLoadedState
状态以显示它正在上传。
上传多部分文件的方法是异步的:
Future<PersonalFile> upload(PersonalFile file) async { //upload code }
这是来自 flutter_bloc 的 mapEventToState:
Stream<PersonalFileListState> mapEventToState(PersonalFileEvent event) async* {}
在此mapEventToState
方法中,我正在等待上传方法将 PersonalFile 的状态更新为UPLOAD_FINISHED
.
问题现在开始了,因为用户从文件选择器中添加了几个文件,然后按下了所有的“上传”按钮。BLoC 在接收到第一个事件并处理“同步”事件后被阻塞,并且 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) })
但里面的代码永远不会被执行。我尝试调试,但无法到达断点。