颤振如何确定何时重建小部件?

Posted

技术标签:

【中文标题】颤振如何确定何时重建小部件?【英文标题】: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.dev/docs/resources/inside-fluttermedium.com/flutter/keys-what-are-they-good-for-13cb51742e7djelenaaa.medium.com/…priscy.medium.com/… 【参考方案1】:

在这个例子中

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

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

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

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

干杯

【讨论】:

以上是关于颤振如何确定何时重建小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用提供程序包收听更改并在颤振中重建小部件?

有状态与无状态的区别如何影响小部件何时重建?

颤振:即使使用了`provider`,小部件仍在重建

如何调用无状态小部件的重建?

setState() 如何重建子部件?

提供程序重建小部件,但在“热重启”之前啥都没有显示