【问题标题】:Flutter Bloc Listener rebuilding even though there is no state change即使没有状态更改,Flutter Bloc Listener 也会重建
【发布时间】:2020-05-21 18:33:35
【问题描述】:

我有一个应用程序,它使用底部导航栏在页面之间切换。为此,我使用Bloc。 在其中一个标签页上,我呈现了一个包含一些项目的列表。此列表是在状态更改为 SchedulesLoaded 时构建的(见图)。

我遇到的问题是,当我使用底部导航栏(使用完全不同的 Bloc)更改页面时,正在重建图片中的列表。侦听器实际上是在重绘小部件而不改变它正在侦听的 Bloc 状态。我无法理解为什么会这样。有人知道吗?

我发现 this 链接讨论了这个问题,但我没有从中得到任何有用的信息。

【问题讨论】:

  • Bloc Listener 中没有任何内容。要测试您的 Bloc 侦听器是否实际执行,请尝试在侦听器中添加: (context, state) {print('bloc listener: $state')}
  • @FederickJonathan Bloc Builder 是否应该在 Bloc Listener 中?
  • @FederickJonathan Bloc 监听器只被调用一次,这是正确的。但是每次我切换回选项卡时都会调用构建器,从而重建小部件。我怎样才能防止这种情况发生?我只想在状态更改后构建列表视图,而不是在构建器中重绘它..
  • 我不知道怎么做,但你可以试试这两个东西 AutomaticKeepAliveClientMixin 和 PageStorage。
  • AutomaticKeepAliveClientMixin 在 blocbuilder 中不起作用。您必须使用 BlocBuilder 中的条件属性。

标签: flutter mobile dart


【解决方案1】:

对于现在正在查看此内容的任何人,您可以在构建 Builder 后调用 buildWhen 以提供构建时间的一些条件。

来自文档:

可以实现可选的 [buildWhen] 以更精细地控制 [BlocBuilder] 重建的频率。 [buildWhen] 将在每个 [cubit] state 更改时调用。 [buildWhen] 采用先前的state 和当前的state,并且必须返回一个 [bool] 来确定是否调用 [builder] 函数。 之前的state会在初始化[BlocBuilder]时被初始化为[cubit]的state。 [buildWhen] 是可选的,如果省略,它将默认为true

例子:

    return Scaffold(
  appBar: AppBar(
    title: BlocBuilder<Bloc, State>(
      buildWhen: (p, c) => p.isEditing != c.isEditing,
      builder: (context, state) {
        return Text(state.isEditing ? 'Edit' : 'Create');
      },
    ),

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 2020-06-17
    • 2021-03-19
    • 1970-01-01
    • 2019-09-05
    • 2019-12-28
    • 2021-10-22
    • 2020-10-10
    • 2021-04-14
    相关资源
    最近更新 更多