【问题标题】:How does flutter determine when to rebuild widgets?颤振如何确定何时重建小部件?
【发布时间】:2021-03-18 13:55:32
【问题描述】:

看看下面的代码sn-p。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final child = CustomTextWidget();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: RaisedButton(
          child: child, //CustomTextWidget(),
          onPressed: () {
            setState(() {});
          }
        ),
      ),
    );
  }
}

class CustomTextWidget extends StatelessWidget {
  CustomTextWidget() {
    print("constructed");
  }
  @override
  Widget build(BuildContext context) {
    print("got built");
    return Text("click me");
  }
}

我可以理解为什么在下面的代码中,CustomTextWidget 的构造函数和构建方法会在每次构建时被调用。这是因为我每次都给一个新的对象。

 RaisedButton(
    child: CustomTextWidget(),
    onPressed: () {
      setState(() {});
      }
  ),

但是为什么如果我给它child CustomTextWidget 对象的构建方法不会在每次构建时都被调用?构造函数被调用一次,这是有意义的,然后构建方法只被调用一次。为什么不是每个 setState 都调用 build?

 RaisedButton(
    child: child,
    onPressed: () {
      setState(() {});
      }
  ),

flutter 如何决定何时调用这些构建方法?

【问题讨论】:

  • 如果有人能提供一个链接到 Flutter 构建算法的详细解释,那就太好了
  • 这可能与您将孩子存储在状态中的事实有关,该状态附加到元素,而不是小部件。小部件总是被重建,这些类基本上就是我们 - 程序员 - 看到的,每次父调用 setstate 或依赖的继承小部件发生变化时,它们都会被重建,然后这些小部件通过类名和/或键与元素相关联,并且元素代表框架实际将呈现的内容。这是您在编程时在脑海中想象它的好方法。

标签: flutter build widget element


【解决方案1】:

在这个例子中

 RaisedButton(
    child: child,
    onPressed: () {
      setState(() {});
      }
  ),

build 没有被调用,因为对象没有改变。 Flutter 必须使用相等运算符 == 来确定在调用 setState 时是否更改了小部件/对象。如果值为false,则不调用build。这在有状态和无状态小部件中是正确的。因此,这里的要点是尽可能始终使用const,并在您不希望重建时在重建上下文之外声明您的小部件。

请记住,对于 StatefulWidgets,还有另一个概念是关于何时重新创建 Element 树持有的 State 对象,在这方面 Flutter 会查看 StatefulWidgetkey 的类型确定是否应重新创建 State 对象。

我希望这会对那里的人有所帮助。

干杯

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 2020-09-22
    • 2020-05-30
    • 2023-03-15
    • 2019-11-02
    • 2019-12-20
    • 2020-10-18
    • 2021-10-17
    相关资源
    最近更新 更多