有没有反对使用的反对意见
final foo = Builder(builder: (BuildContext context) {
...
});
代替
class Foo extends StatelessWidget {
@override
Widget build(Build context) {
...
}
}
?
使用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
中的文本字段正确地重置为其初始值。