【问题标题】:Is there a callback when the FutureBuilder is done building in Flutter?当 FutureBuilder 在 Flutter 中构建完成时是否有回调?
【发布时间】:2020-06-18 20:48:39
【问题描述】:

有没有办法知道 Flutter 中何时构建了所有小部件,包括 FutureBuilder 小部件。 WidgetsBinding.instance.addPostFrameCallback 在构建完成时调用,但在 FutureBuilder 构建之前。

我在 FutureBuilder 中有一个列表,它的数据是从服务器获取的。 FutureBuilder 之外还有另一个 Text 小部件,它显示列表项的计数。填充列表时,我需要更新此计数小部件。如果不使用流,是否会在构建 FutureBuilder 时触发回调方法。

【问题讨论】:

  • 未来构建器在未来完成时构建。您能否分享有关您的确切用例的更多信息?
  • 它闻起来像典型的XY problem,你需要它做什么?
  • @pskink :- 我在 FutureBuilder 中有一个列表,其数据是从服务器获取的。 FutureBuilder 之外还有另一个 Text 小部件,它显示列表元素的数量。填充列表后,我需要更新此计数小部件。
  • 是什么阻止您在FutureBuilder 中包含这两个小部件? (如果你真的需要,也可以使用两个FutureBuilders)
  • @pskink:- UI 设计限制,但这当然是一个解决方案。我需要知道的是,类似于'Widget.instance.addPostFrameCallback',它在构建方法完成时调用(不检查FutureBuilder)。 FutureBuilder 也完成时是否有回调。

标签: flutter


【解决方案1】:

有很多方法。如果您打算在不使用状态管理的情况下执行此操作,则可以使用 ValueNotifier。

ValueNotifier<int> total = ValueNotifier(0);

FutureBuilder()..future.then((snapshot) {
                  total.value = snapshot.total;
                });

ValueListenableBuilder(
            valueListenable: total,
            builder: (context, value, widget) {
              return Text(value.toString());
            },
          ),

但我建议你使用provider package

【讨论】:

  • 感谢您的回复,因此没有类似于“addPostFrameCallback”的可用回调。我们将不得不使用其他方式,如 ValueNotifier 或 Streams。
  • @NasfiU,不 - 您不需要任何额外的 ValueNotifiers 或 Streams - 要么使用一个在其 buildercallback 中构建两个小部件的 FutureBuilder,要么使用两个独立的 @987654328 @s
  • @pskink :- 我同意,但是如果在构建整个 UI 时要应用一些逻辑怎么办。我们怎么知道布局已经完成?类似于 iOS 中的“viewDidLayoutSubviews()”。
  • @NasfiU 然后使用Future api - 您需要使用与FutureBuilder相同的Future
  • WidgetsBinding.instance.addPostFrameCallback in flutter 让你知道构建方法何时完成。但这不会等待 FutureBuilder 完成布局。 @pskink
【解决方案2】:

当有数据和连接完成时,只需在你的 futurebuilder 中使用WidgetsBinding.instance.addPostFrameCallback

FutureBuilder<List<Object>>(
    future: _listFuture,
    builder: (context, AsyncSnapshot snapshot) {
      
      if(snapshot.hasData && snapshot.connectionState == ConnectionState.done){
        WidgetsBinding.instance
            .addPostFrameCallback((_) {
              
        });
      }

      return ...
    }
);

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2011-09-05
    • 2020-02-22
    • 2020-06-18
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多