gpt4 book ai didi

asynchronous - flutter 和 block 异步 yield

转载 作者:行者123 更新时间:2023-12-04 10:27:56 25 4
gpt4 key购买 nike

我正在使用带有 BLoC 模式的 flutter (使用 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并将其传递给创建 PersonalFile 的 BLoC对象并将其状态设置为 READY_TO_UPLOAD .此 PersonalFile对象获取
添加到包含用户正在添加(和上传)的所有 PersonalFile 的列表中。然后 BLoC 以 yield 响应( PersonalFileListLoadedState(blocPersonalFileList) )到 UI 以呈现信息。

添加后,“立即上传”按钮将在该 PersonalFile 的 UI 中呈现。 .按下时,这会调用 PersonalFileUploadEvent事件并沿 PersonalFile 发送到 BLoC 开始上传过程(分段上传)。
收到事件后,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 发送新的 ListPersonalFile他们的状态更改为 UPLOAD_FINISHED ?

我尝试将上传方法的签名更改为:
Stream<PersonalFile> upload(PersonalFile file) async* { //upload code }

并使用:
.then((file) { yield PersonalFileListLoadedState(listWithUpdatedPersonalFileStatus) })

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

最佳答案

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

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

希望这可以帮助。

关于asynchronous - flutter 和 block 异步 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60557864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com