gpt4 book ai didi

flutter - 使用 Builder 而不是 StatelessWidget

转载 作者:IT王子 更新时间:2023-10-29 07:21:28 26 4
gpt4 key购买 nike

是否有反对使用

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

代替

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

?

最佳答案

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

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

更具体地说,当 runtimeType 发生变化时,Flutter 将卸载该位置的先前 widget 树,然后挂载新的 widget。

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

反过来,这意味着通过使用 Builder 而不是制作 StatelessWidget 子类,它可能会产生不良行为,例如重用先前小部件树的状态。


举个例子,假设我们想要在两种不同类型的小部件之间切换——这两种小部件都实例化了一个TextField

有了构建器,我们的两个小部件将是:

final foo = Builder(builder: (_) => TextField());
final bar = Builder(builder: (_) => TextField());

然后这样使用:

Widget build(BuildContext context) {
return condition ? foo : bar;
}

我们的类(class)有:

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 中的文本字段正确重置为其初始值。

关于flutter - 使用 Builder 而不是 StatelessWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com