Flutter 缓存子窗口小部件与重新创建它们
我不确定是否缓存一个小部件实例并在Flutter 缓存子窗口小部件与重新创建它们,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我不确定是否缓存一个小部件实例并在build()方法中重用它会产生显著的不同 假设我们有两个小部件类: class ParentWidget extends StatelessWidget { ParentWidget({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Container( // or some other widgets tha
build()
方法中重用它会产生显著的不同
假设我们有两个小部件类:
class ParentWidget extends StatelessWidget {
ParentWidget({Key key})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container( // or some other widgets that define the ui
child: ChildWidget(/*...*/),
);
}
}
class ChildWidget extends StatelessWidget {
ChildWidget({Key key}) : super(key: key); // no constant
@override
Widget build(BuildContext context) {
/*
* returns some Widget
*/
}
}
据我所知,每次flatter在ParentWidget
上调用build()
,都会创建一个新的ChildWidget
,并附加到元素树中的同一元素。除非const-ChildWidget
可用(例如ChildWidget
具有const构造函数)
但是,我们可以像这样缓存子级:
class ParentWidget extends StatelessWidget {
final Widget child;
ParentWidget({Key key})
: child = ChildWidget(/*...*/),
super(key: key);
@override
Widget build(BuildContext context) {
return Container(
// or some other widgets that define the ui
child: child, // <-- use child instead of ChildWidget()
);
}
}
类ParentWidget扩展了无状态widget{
最后一个孩子;
ParentWidget({Key})
:child=ChildWidget(/*…*/),
超级(键:键);
@凌驾
小部件构建(构建上下文){
返回容器(
//或者其他一些定义ui的小部件
child:child,//可能存在差异,例如,如果child小部件分配资源或具有较大的子树
官方的FlatterAPI文档确实建议在某些情况下使用缓存。但一般来说,在尝试优化视图时,不应该首先使用缓存
阅读有关和小部件的文档,特别是“性能注意事项”部分有很多相关的进一步信息。例如:
- 如果子树没有更改,则缓存表示该子树的小部件,并在每次可以使用时重新使用它
- 尽可能使用const小部件(这相当于缓存小部件并重新使用它)
在的文档中,如果小部件表示的子树没有更改,建议缓存该小部件:
如果子树没有更改,则缓存表示该子树的小部件,并在每次可以使用时重新使用它。与新的(但配置相同)小部件相比,重新使用小部件的效率大大提高要创建的小部件。将有状态部分分解成一个接受子参数的小部件是一种常见的方法
因此,我得出结论,每当小部件更改状态时,不基于状态更改的子树都应该被缓存和重用
然而,问题中声明的示例并不是选择缓存小部件是一个好选择的情况,因为只有未更改子树的根应由该子树的父树缓存。但是由于ParentWidget
本身是一个无状态小部件
,每次C时它都将是未更改子树的一部分hildWidget
是。因此,ParentWidget
的某个有状态的父级应该负责缓存。多亏了您,我在的文档中找到了相关部分。他们建议在子树不发生变化时缓存它,因为“重新使用一个小部件要比重新使用一个新的(但配置相同)小部件效率更高。”在许多情况下,你可以通过其他方式优化渲染。我制作了颤振应用程序,而不需要缓存一个小部件。我同意。这个问题不是关于我在开发中遇到的具体问题,而是关于框架的工作。而且“效率更高”表示我的性能有了很大提高。