首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Builder代替StatelessWidget

用Builder代替StatelessWidget
EN

Stack Overflow用户
提问于 2019-03-29 21:41:29
回答 1查看 164关注 0票数 0

是否有人反对使用

代码语言:javascript
复制
    final foo = Builder(builder: (BuildContext context) {
    ...
    });

而不是

代码语言:javascript
复制
    class Foo extends StatelessWidget {
      @override
      Widget build(Build context) {
      ...
      }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 22:01:29

使用Builder而不是创建适当的子类存在缺陷。

Flutter的小部件系统使用runtimeType变量来确定它应该如何运行。

更确切地说,当runtimeType发生变化时,Flutter将在该位置卸载上一个小部件树,然后挂载新的小部件树。

但是通过使用Builder,runtimeType永远不会改变,它会混淆框架。

这反过来意味着,通过使用Builder而不是创建一个StatelessWidget子类,它可能有一些不想要的行为,比如重用上一个小部件树的状态。

为了举个例子,考虑一下我们想要在两种不同类型的小部件之间切换--这两种小部件都实例化了一个TextField。

对于构建器,我们的两个小部件是:

代码语言:javascript
复制
final foo = Builder(builder: (_) => TextField());
final bar = Builder(builder: (_) => TextField());

然后用这种方法:

代码语言:javascript
复制
Widget build(BuildContext context) {
  return condition ? foo : bar;
}

我们会有这样的课程:

代码语言:javascript
复制
class Foo extends StatelessWidget {
  @override
  Widget build(Build context) => TextField();
}

class Bar extends StatelessWidget {
  @override
  Widget build(Build context) => TextField();
}

用于下列用途:

代码语言:javascript
复制
Widget build(BuildContext context) {
  return condition ? Foo() : Bar();
}

此时,我们运行我们的应用程序,并开始从我们的foo/Foo小部件在文本字段中键入一些内容。

然后我们做了一个动作,它将切换到bar/Bar

在这一步中,结果将根据使用类还是Builder而有所不同。

  • 使用foo/barbar中的文本字段显示您在foo文本字段中键入的文本。
  • 使用Foo/Bar类不会发生这种情况。Bar中的文本字段正确地将其重置为初始值。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55425804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档