[英]flutter and bloc asynchronous yield
我正在使用带有 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,后者创建一个PersonalFile
对象并将其状态设置为READY_TO_UPLOAD
。 这个PersonalFile
对象被添加到一个列表中,该列表包含用户正在添加(和上传)的所有 PersonalFile。 然后 BLoC 使用PersonalFileListLoadedState(blocPersonalFileList)
响应 ( yield
) 到 UI 以呈现信息。
添加后,“立即上传”按钮将在该PersonalFile
的 UI 中呈现。 当按下时,这个调用PersonalFileUploadEvent
事件,并沿着发送PersonalFile
到集团开始上传过程(多上传)。 收到事件后,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 在接收到第一个事件后被阻塞并“同步”处理事件,并且 UI 保持好像另一个人的 PersonalFile 的“上传”按钮没有被按下,直到第一个完成(然后是下一个,依此类推)。
在一个事件被完全处理后(上传完成),下一个被处理,这是有道理的,因为我正在等待上传方法完成。
我该如何编写此代码,以便如果用户在 UI 中按下多个“上传”按钮,BLoC 不会被阻止(因此 UI,因为 BLoC 无法yield
新状态)并且所有文件都被上传到并行但直到每个人完成 BLoC 发送新的PersonalFile
List
,其状态更改为UPLOAD_FINISHED
?
我尝试将上传方法的签名更改为:
Stream<PersonalFile> upload(PersonalFile file) async* { //upload code }
并使用:
.then((file) { yield PersonalFileListLoadedState(listWithUpdatedPersonalFileStatus) })
但里面的代码永远不会被执行。 我试过调试,但无法到达断点。
不确定您如何调用该集团来启动流程上传。 但是,如果您在按下按钮时使用bloc.add(event)
它应该以异步方式处理并根据需要产生新状态。
另请注意,当您处理状态更改时,如果多次产生相同的状态,则侦听器将只收听一次,因此您不会在 UI 中看到多个更新。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.