2

我正在使用带有 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 更新 PersonalFileyieldPersonalFileListLoadedState状态以显示它正在上传。

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

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 才会发送新ListPersonalFile状态更改为UPLOAD_FINISHED

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

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

并使用:

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

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

4

1 回答 1

2

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

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

希望这可以帮助。

于 2020-04-08T17:58:31.053 回答