首页 > 解决方案 > Flutter 中的 Widget 生命周期是如何工作的?

问题描述

为了优化 Flutter App 的性能,重要的是只在实际需要重建 Widget 时才重建它们。在使用const WidgetsTransitionBuilder 模式Keys覆盖 == 运算符之间,似乎有不同的方法来减少 Widget 重建,但我不知道如何交互。

官方文档建议在构建方法中做尽可能少的工作。这与在 Widget 的构造函数中完成的工作相比如何?构造函数的调用频率是否与构建函数一样频繁,多于还是少于它?如果我有一个有状态的小部件,我可以通过在状态中而不是在构造函数或构建方法中缓存一些数据来提高性能吗?

在 Reddit 上有一个关于使用函数与无状态小部件的讨论,其中一些人认为无状态小部件导致重建较少,而另一些人则认为没有区别。我想充分了解 Flutter 的 Widget Lifecycle 以了解在特定情况下两者之间是否存在差异。

我正在寻找有关这些不同机制如何交互以就如何减少我的应用程序中不必要的 Widget 构建做出正确决策的解释。

标签: flutterflutter-widget

解决方案


而是我从开发人员自己那里得到了一个很好的解释,这是一个解释小部件生命周期的短片

2019年Google Developer Days China做了更详细的解释

如果您谈论性能,那么功能方法会更好。考虑一下:

class TestWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final streamController = StreamController<String>.broadcast();

    Future.delayed(Duration(seconds: 3)).then((_) {
      streamController.sink.add('new value to received');

      streamController.close();
    });

    return StreamBuilder(
      stream: streamController.stream,
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        final newVal = snapshot.data;
        return Text(newVal ?? 'this is initial value');
      },
    );
  }
}

在函数式方法中,状态不是由小部件而是由 保存的streamController,并且TestWidget的 build 方法只调用一次,并且builder每次在stream.

我发现这种方法开发起来也是最灵活的,因为您可以在一个地方拥有多个流,并且作为一个木偶操作者来控制它们。

==== 一个小切线 ============================================ ==========

我建议你研究一下这种BLoC模式。

根据我的经验,如果你狂热地遵循一种方法而不是另一种方法,你最终可能会“伤害自己”,所以我建议不要害怕同时使用这两种方法,具体取决于用例。

例如,如果你有一个按钮,里面有一个递增的 int 值(就像一个徽章),当你点击它时它会递增。将值发送到BLoC并将其保存在那里,然后通过流发送回事件以更新 UI 是多余的,这就是我将使用StatefulWidget.


推荐阅读