【问题标题】:Why is the Streamlistener reacting differently?为什么 Streamlistener 的反应不同?
【发布时间】:2020-01-12 06:33:27
【问题描述】:

我正在尝试与 Bloc 合作使用 Streambuilder。问题是,UI 仅在昂贵的 Funktion 完成时才会更新。似乎那时,然后才对流进行更新。但我不知道为什么?

我实现了一个包含 4 个事件的简单 Bloc: 1. 通过 Bloc Sate 对象调用的 Future 2. 一个在集团内部被调用的未来 3. 在 Bloc 内部调用的函数 4 只使用 Future.delay

我试图理解为什么一切都像预期的那样,但当我使用前两个时却没有。我的猜测是我对事件循环有一个基本的误解,但我不明白为什么 2 和 4 或 1 和 4 之间的行为应该有所不同

为了方便起见,我在 Github 上做了一个示例项目 https://github.com/pekretsc/bloceventloop.git

所以我有我的刷新方法,可以将新状态广告到流中。

if (event is ExpensiveEventInState) {
  refresh(BlocUIState.Waiting);
  String result = await blocState.doSomeThing();
  if (result == '') {
    refresh(BlocUIState.Fin);
  } else {
    refresh(BlocUIState.Fail);
  }
}

    if (event is ExpensiveEventWhyDoesThisWork) {
  refresh(BlocUIState.Waiting);
  await Future.delayed(Duration(seconds: 3));
  refresh(BlocUIState.Fin);
}

所以问题是,第一个和第二个事件的行为方式不应该相同吗? 但发生的情况是,在第一种情况下,刷新被完全忽略,只是 Fin 被添加到流中。 (我查了一下,不是识别太快)

【问题讨论】:

    标签: flutter stream event-loop bloc


    【解决方案1】:

    StreamListener 的回调在事件被推送到流时立即被调用。

    另一方面,StreamBuilderbuilder 回调不是。对于最常见的用例,每帧最多调用一次。

    【讨论】:

    • 好的,如果这是问题所在,Streambuilder 不应该在等待时间结束之前做出反应吗?它确实会在 Future 延迟时重建。那么为什么不在 Future doSomeThing 上呢?在那里我做同样的事情,为什么忽略第一个 Streamevent
    猜你喜欢
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多