是否有人反对使用
final foo = Builder(builder: (BuildContext context) {
...
});而不是
class Foo extends StatelessWidget {
@override
Widget build(Build context) {
...
}
}发布于 2019-03-29 22:01:29
使用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中的文本字段正确地将其重置为初始值。https://stackoverflow.com/questions/55425804
复制相似问题