颤振如何确定何时重建小部件?
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
,并在您不希望重建时在重建上下文之外声明您的小部件。
请记住,对于 StatefulWidget
s,还有另一个概念是关于何时重新创建 Element 树持有的 State
对象,在这方面 Flutter 会查看 StatefulWidget
和 key
的类型确定是否应重新创建 State
对象。
我希望这会对那里的人有所帮助。
干杯
【讨论】:
以上是关于颤振如何确定何时重建小部件?的主要内容,如果未能解决你的问题,请参考以下文章