flutter 和 bloc 异步 yield

flutter and bloc asynchronous yield

我正在使用 flutter 和 BLoC 模式(使用 flutter_bloc 库)并且我有这些事件:

PersonalFileAddedEvent(File file), PersonalFileUploadEvent(PersonalFile file)(均从 PersonalFileEvent 延伸)

File 是来自文件选择器的文件,PersonalFile 是 class 具有以下枚举状态:READY_TO_UPLOAD, UPLOADING, UPLOAD_FINISHED.

来自 BLoC 的状态:

PersonalFileListLoadedState(List<PersonalFile> files)(从 PersonalFileListState 扩展)

当用户选择文件时,UI 调用事件 PersonalFileAddedEvent 并将其传递给创建 PersonalFile 对象并将其状态设置为 READY_TO_UPLOAD.这个 PersonalFile 对象得到 添加到一个列表中,该列表包含用户正在添加(和上传)的所有个人文件。 BLoC 然后用 PersonalFileListLoadedState(blocPersonalFileList) 响应 (yield) 到 UI 以呈现信息。

添加后,"upload now" 按钮会在 UI 中呈现 PersonalFile。按下时,这会调用 PersonalFileUploadEvent 事件并将 PersonalFile 发送到 BLoC 以开始上传过程(分段上传)。 收到事件后,BLoC 立即将此 PersonalFile 的状态更新为 UPLOADINGyield PersonalFileListLoadedState 状态,并将 PersonalFile 的状态更新为 UI 以表明它正在上传。

上传多部分文件的方法是异步的:

Future<PersonalFile> upload(PersonalFile file) async { //upload code }

这是来自 flutter_bloc 的 mapEventToState:

Stream<PersonalFileListState> mapEventToState(PersonalFileEvent event) async* {}

在此 mapEventToState 方法中,我正在等待上传方法将 PersonalFile 的状态更新为 UPLOAD_FINISHED

问题现在开始了,因为用户从文件选择器中添加了几个文件,并按下了所有 "upload" 按钮。 BLoC 在收到第一个事件后被阻塞并处理事件 "synchronous like" 和 UI 就好像另一个人的 PersonalFile 的 "upload" 按钮直到第一个完成(然后是下一个,依此类推)才被按下。

在一个事件得到完全处理(上传完成)后,下一个事件得到处理,这是有道理的,因为我正在等待上传方法完成。

我如何编写此代码,以便如果用户按下 UI 中的多个 "upload" 按钮,BLoC 不会被阻止(因此 UI 因为 BLoC无法 yield 新状态)并且所有文件都已上传 并行但直到每个完成 BLoC 发送 PersonalFile 的新 List 并将它们的状态更改为 UPLOAD_FINISHED?

我尝试将上传方法的签名更改为:

Stream<PersonalFile> upload(PersonalFile file) async* { //upload code }

并使用:

.then((file) { yield PersonalFileListLoadedState(listWithUpdatedPersonalFileStatus) })

但是里面的代码永远不会执行。我试过调试,但我无法到达断点。

不确定您是如何调用 bloc 来启动进程上传的。 但是,如果您在按下按钮时使用 bloc.add(event),则应以异步方式处理它并根据需要产生新状态。

另请注意,当您处理状态更改时,如果多次产生相同的状态,侦听器将仅侦听一次,因此您不会在 UI 中看到多个更新。

希望对您有所帮助。