【发布时间】: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