dart - setState() 如何重建子部件?
问题描述
我只需要一些关于在调用 setState() 时颤振有状态小部件如何构建有状态子级的想法。请看下面的代码。
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({Key key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Widget build(BuildContext context) {
print("Parent build method invoked");
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
StatefulChild(), // Keeping this line gives the output 1
statefulChild, // Keeping this line gives the output 2
RaisedButton(
child: Text('Click me'),
onPressed: () {
setState(() {});
},
)
],
),
),
);
}
StatefulChild statefulChild = StatefulChild();
}
class StatefulChild extends StatefulWidget {
StatefulChildState createState() => StatefulChildState();
}
class StatefulChildState extends State<StatefulChild> {
@override
Widget build(BuildContext context) {
print("Child00 build method invoked");
return Container();
}
}
当按下 RaisedButton 时,
输出 1 // 仅保留StatefulChild()
,
I/flutter ( 2903): Parent build method invoked
I/flutter ( 2903): Child00 build method invoked
输出 2 // 仅保留statefulChild
,
I/flutter ( 2903): Parent build method invoked
这里有什么区别?引擎盖下会发生什么?非常感谢详细的解释。
解决方案
当 widget 树重建时,Flutter 会使用==
该build
方法返回的前一个和新的 widget 进行比较。
这种情况有两种情况:
==
是false
。在这种情况下,Flutter 将比较runtimeType
&key
以了解是否应该保留前一个小部件的状态。然后 Flutter 调用build
该小部件==
是true
。在这种情况下,Flutter 会中止构建小部件树(也不会调用build
)。
由于小部件的不变性,这是一种可能的优化。
由于小部件是不可变的,如果==
没有更改,则意味着没有什么可更新的。因此,Flutter 可以安全地优化它。
推荐阅读
- docker-compose - 使用 Docker Compose 将 Asp.Net ABP angular 和 asp.net core 部署到 Azure
- java - 在 MongoDB 上插入多个 CSV 文件时出现批量写入操作错误
- javascript - 尝试访问本地 json 文件时出现 CORS 错误
- react-native - 在 React Native 中操作全局状态变量
- python - 即使使用 selenium 也无法让 HTML 匹配检查页面 - Python 3
- r - 使用 mutate() 将列添加到数据框作为任意其他列集的函数
- java - 如何编写自己的 ListSelectionEvent?
- aws-lambda - 使用 Lambda 代理时如何将 lambda 段 (XRAY) 标记为错误
- express - socket.io 可以加入房间但不能离开房间
- excel - 创建 2 个列表,将每个值与 1 个列表中的每个值进行比较