在艾米丽·福图纳的文章(和视频)中,她提到:
globalkeys有两个用途:它们允许小部件更改父项
应用程序中的任何地方都不会丢失状态,或者可以使用它们
访问完全不同部分中另一个小部件的信息
小部件树的。第一个场景的示例可能是
想在两个不同的屏幕上显示相同的小部件,但保持
在同样的状态下,你会想要使用一个globalkey。
她的文章包括一个名为“使用globalkey来重用idget”的应用程序的GIF演示,但没有提供源代码(可能是因为它太小了)。您还可以在这里看到一个快速的视频演示,从8:30开始标记:https://youtu.be/kn0EOS-ZiIc?t=510
我如何实现她的演示?我在哪里定义globalkey变量以及如何/在哪里使用它?基本上,例如,我想显示一个每秒钟计数一次的计数器,并在许多不同的屏幕上显示它。这是Globalkey能帮我的吗?

最佳答案

使用GlobalKey在树上移动一个小部件最常见的用例是有条件地将“子”包装到另一个类似这样的小部件中:

Widget build(context) {
  if (foo) {
    return Foo(child: child);
  }
  return child;
}

使用这些代码,您会很快注意到,如果child是有状态的,那么切换foo将使child失去其状态,这通常是意外的。
为了解决这个问题,我们将使小部件具有状态,创建一个GlobalKey,并将child包装成一个KeyedSubtree
下面是一个例子:
class Example extends StatefulWidget {
  const Example({Key key, this.foo, this.child}) : super(key: key);

  final Widget child;
  final bool foo;

  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  final key = GlobalKey();

  @override
  Widget build(BuildContext context) {
    final child = KeyedSubtree(key: key, child: widget.child);

    if (widget.foo) {
      return Foo(child: child);
    }
    return child;
  }
}

关于flutter - 如何在更换 parent 时使用“GlobalKey”来维护小部件的状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56895273/

10-12 04:27