在艾米丽·福图纳的文章(和视频)中,她提到:
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/