颤振:如何使用“等待”等待其他 BLoC 事件完成

Posted

技术标签:

【中文标题】颤振:如何使用“等待”等待其他 BLoC 事件完成【英文标题】:flutter: how to use 'await for' to wait for other BLoC event to finish 【发布时间】:2021-01-06 10:12:42 【问题描述】:

在屏幕初始化时,我正在通过 externalData_bloc 加载我的数据。在同一屏幕上,我还渲染了另一个由 internalData_bloc 控制的小部件,用于用户输入,这取决于导入记录的数量(需要多少行)。当然,渲染比数据加载快,所以我需要空行。

我发现这很好 question & answer,但是,我没有让它工作。解决方案说

Future loginProcess() async 
  await for (var result in _userBloc.state) 
    if (result.status == Status.finished) 
      return;
    
  

我在我的存储库中。在这里,我还将外部数据存储在一个变量中。所以在存储库类中,我有获取记录数的函数(properties 存储在存储库中,我想返回它的长度)。

  Future<int> getNoOfProperties(int problem)  async 
    LogicGraphsPStmntBloc bloc = LogicGraphsPStmntBloc();
    Future propertiesLoad() async 
      await for (var s in bloc) 
        if (s == LogicGraphsPStmntLoadSuccess) 
          return;
        
      
    
    propertiesLoad();
    return properties.length;
  

但是无论我尝试为await for (var result in XXXX)if (s.YYY == ZZZ) 输入什么,它都不起作用。我的理解是,XXXX 必须是一个流,这就是我使用bloc = LogicGraphsPStmntBloc() 的原因。但我想这会创建另一个实例,而不是我的小部件中使用的实例。 LogicGraphsPStmntBloc 也不起作用,状态也不起作用。 bloc 至少不会在编辑器中引发错误,但除了实例问题之外,if 语句会引发错误,其中在 cubit.dart 中 StreamSubscription&lt;State&gt; listen(... 使用 cancelOnError 调用。有没有人有启示?

【问题讨论】:

【参考方案1】:

Bloc 使用 Stream 并且具有连续的数据流。您可能想要监听数据的变化而不是完成的任务。使用 StreamBuilder 是一种方法。

StreamBuilder<User>(
  stream: bloc.userState, // Stream from bloc
  builder: (context, AsyncSnapshot<State> snapshot) 
    if (snapshot.hasData) 
      // check if auth status is finished
    
  
)

【讨论】:

以上是关于颤振:如何使用“等待”等待其他 BLoC 事件完成的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 小部件测试中等待未来完成?

如何在同一个块中等待多个块事件

在使用 flutter_bloc 库调度事件之前等待一些结果

如何取消颤振/飞镖集团中的“等待”

颤振:在 BLoC 中,事件比较失败,尽管使用 equatbale

Flutter - 转换颤振 bloc 事件以添加去抖动