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 的状态更新为 UPLOADING
和 yield
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 中看到多个更新。
希望对您有所帮助。
我正在使用 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 的状态更新为 UPLOADING
和 yield
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 中看到多个更新。
希望对您有所帮助。