【问题标题】:Updating a stateful widget variable after it has rendered?渲染后更新有状态的小部件变量?
【发布时间】:2019-11-05 08:27:16
【问题描述】:

我正在使用带有两个选项卡的TabBarView,每个选项卡都显示一个有状态小部件——我们称它们为主小部件和配置小部件。

配置小部件充当主小部件的“配置部分”——我使用它来设置主小部件中的背景颜色和 URL 变量等内容,该变量用于从 Web 服务中获取数据。

Main Widget 有一个由该 Web 服务填充的 ListView。我正在使用Bloc 模式将事件从一个小部件发送到另一个小部件,这就是配置小部件将 URL 值发送到主小部件的方式——一个事件被触发,由 bloc 提供成为“状态” ' 带有新 URL 的对象,Main Widget 可以在其构造函数中读取并使用它来构建 ListView。

现在我在主小部件中使用wantKeepAlive 机制来避免重新填充 ListView,如果我没有更改配置小部件中的 URL - 如果我不这样做,主小部件会在我返回时重建它的选项卡,即使我没有更改配置小部件中的任何内容。

我想要做的是有选择地设置该值,以便在配置中更改 URL 时,将 wantKeepAlive 值更新为 false,以便 ListView 使用重建新网址。但是在构建完成后,将wantKeepAlive 的值重新设置为true,这样就不会重新构建,直到下一次 URL 更改。

build() 方法完成时,我是否可以调用生命周期方法,我可以在哪里设置wantKeepAlive 设置?我认为在构建方法本身中这样做是行不通的。欢迎提出建议,谢谢。

【问题讨论】:

  • "Right now I use the wantKeepAlive mechanism in the Main Widget to avoid repopulating the ListView " - 你的意思是你的集团在你的两个标签之间切换时执行了一些繁重的工作?
  • @pskink 没什么大不了的,只是在需要时发送一个事件或进行网络服务调用。它不会进行冗长的计算或任何类似的事情。
  • 那么在这种情况下重新填充 ListView 有什么问题?小部件重建在颤振中非常便宜......
  • @pskink 我想我误解了你所说的“重”的意思——调用网络服务需要几秒钟,如果我不这样做,我宁愿不必等待列表重绘'如果数据已经存在,则不必这样做。
  • 好的,问题是为什么每次切换选项卡时都要调用 Web 服务 - 通常只有 ListView 需要使用已经从 Web 服务获取的数据重建 - 似乎你的集团模式没有正确使用

标签: flutter bloc statefulwidget


【解决方案1】:

您可以在构建小部件后使用WidgetsBinding 实例的addPostFrameCallback 执行一些代码。

  _onLayoutDone(_) {
    //add your code here
  }

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback(_onLayoutDone);
    super.initState();
  }

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 2019-08-30
    • 2021-05-24
    • 1970-01-01
    • 2019-10-28
    • 2021-04-24
    • 2021-06-29
    • 2023-01-28
    • 2019-06-17
    相关资源
    最近更新 更多