是否反对使用
final foo = Builder(builder: (BuildContext context) {
...
});
代替
class Foo extends StatelessWidget {
@override
Widget build(Build context) {
...
}
}
?
答案 0 :(得分:1)
使用Builder
而不是创建适当的子类存在缺陷。
Flutter的窗口小部件系统使用runtimeType
变量来确定其行为。
更具体地说,当runtimeType
发生变化时,Flutter会在该位置卸载先前的小部件树,然后安装新的小部件树。
但是通过使用 Builder ,runtimeType
永远不会改变,并且会混淆框架。
这反过来意味着,通过使用Builder
而不是创建 StatelessWidget 子类,它可能会具有不良的行为,例如重用先前的小部件树的状态。
为了举例说明,请考虑我们要在两种不同类型的小部件之间进行切换,这两种小部件都实例化 TextField 。
使用构建器,我们的两个小部件将是:
final foo = Builder(builder: (_) => TextField());
final bar = Builder(builder: (_) => TextField());
然后使用这种方式:
Widget build(BuildContext context) {
return condition ? foo : bar;
}
有了课程,我们将有:
class Foo extends StatelessWidget {
@override
Widget build(Build context) => TextField();
}
class Bar extends StatelessWidget {
@override
Widget build(Build context) => TextField();
}
原样使用:
Widget build(BuildContext context) {
return condition ? Foo() : Bar();
}
这时,我们运行应用程序,并开始从foo
/ Foo
小部件在文本字段中键入一些内容。
然后我们要执行的操作将切换为bar
/ Bar
。
在此步骤中,结果将取决于您使用的是类还是Builder
:
使用foo
/ bar
,bar
内的文本字段显示您在foo
的文本字段中键入的文本。
使用Foo
/ Bar
类,不会发生这种情况。 Bar
中的文本字段可以正确重置为其初始值。