Flutter 颤振框架中使用的键是什么?

Flutter 颤振框架中使用的键是什么?,flutter,Flutter,颤振是一个令人惊讶的框架,简单易用。我必须看到文档非常好,但是有一些概念对我来说仍然很模糊,例如键参数。根据文档键是小部件、元素和语义节点的标识符。这很清楚,但为什么我需要识别我的小部件呢。到目前为止,我从未在编码中使用过键。在我的代码中使用密钥有什么好处吗?谢谢。大多数时候您不需要使用键,框架会为您处理键,并在内部使用它们来区分小部件。不过,在一些情况下,您可能需要使用它们 一种常见的情况是,如果需要通过键来区分小部件,ObjectKey和ValueKey可以用于定义小部件的区分方式。一个示例

颤振是一个令人惊讶的框架,简单易用。我必须看到文档非常好,但是有一些概念对我来说仍然很模糊,例如
参数。根据文档
键是小部件、元素和语义节点的标识符。
这很清楚,但为什么我需要识别我的小部件呢。到目前为止,我从未在编码中使用过键。在我的代码中使用密钥有什么好处吗?谢谢。

大多数时候您不需要使用键,框架会为您处理键,并在内部使用它们来区分小部件。不过,在一些情况下,您可能需要使用它们

一种常见的情况是,如果需要通过键来区分小部件,ObjectKey和ValueKey可以用于定义小部件的区分方式。一个示例是,另一个示例是带有动画删除的列表:

另一个例子是,如果您希望从父级访问一个子级,则可以在父级中创建GlobalKey并将其传递给子级的构造函数。然后您可以执行globalKey.state来获取孩子的状态(例如,在按钮按下回调中)。注意,这不应该被过度使用,因为通常有更好的方法来解决它


您可能永远都不需要考虑它,直到您使用一个小部件直接告诉您为其子项定义键。

谢谢雷米。这正是我所需要的。这将为你清除一切@ToniJoeKeys也可以用来提高性能…非常感谢这一点。但我还是很困惑。例如,在这个链接提供的示例中,如果您正在谈论ShoppingList示例,那么代码在使用或不使用键的情况下仍然有效-是的,它可能以任何一种方式工作,因为它非常基本,但是当您开始执行诸如删除或添加之类的操作时,行为变得更加复杂。例如,当您删除第二个项目时,它可能不会实际删除第二个小部件,而只是将其更改为包含以前在第三个小部件中的值,并将第四个小部件更改为第三个小部件,等等。基本列表中的值看起来相同。但是,如果您试图执行动画删除之类的操作,或者有一个很长的列表(即100个或1000个或项目),那么区别就变得非常重要。实际上,使用
GlobalKey
是不推荐的。你几乎总能找到一种不用它的方法。
键最常见的用法是当您需要在子列表中列出动画时。例如添加/删除,或简单的重新排序。@RémiRousselet请提供一个参考,说明使用GlobalKey是不受欢迎的。@RémiRousselet虽然我同意不应该使用全局键,但它可能比可撤销列表之类的东西更经常出现,但这完全是主观的,取决于你正在构建的应用程序的类型。我已经把那个特定的部分去掉了。但是它在一些flatter演示中使用,并且在flatter的源代码(即Navigator)中使用得相当频繁。如果您开始有复杂的动画和小部件之间的交互,它是必不可少的。它肯定不会被弃用,因为这意味着它不能被使用,也不会存在于框架的未来版本中。