使用Builder而不是StatelessWidget

时间:2019-03-29 21:41:30

标签: flutter

是否反对使用

    final foo = Builder(builder: (BuildContext context) {
    ...
    });

代替

    class Foo extends StatelessWidget {
      @override
      Widget build(Build context) {
      ...
      }
    }

1 个答案:

答案 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 / barbar内的文本字段显示您在foo的文本字段中键入的文本。

  • 使用Foo / Bar类,不会发生这种情况。 Bar中的文本字段可以正确重置为其初始值。