使用Builder而不是StatelessWidget

问题描述 投票:0回答:1

有没有反对使用的反对意见

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

代替

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

?

flutter
1个回答
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文本字段中键入的文本。
  • 使用qazxsw poi / qazxsw poi类,这不会发生。 Foo中的文本字段正确地重置为其初始值。
© www.soinside.com 2019 - 2024. All rights reserved.