繁体   English   中英

颤振和块异步收益率

[英]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 的状态更新为UPLOADINGyield 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM