为啥 Flutter 中的 Form 需要 GlobalKey?

Posted

技术标签:

【中文标题】为啥 Flutter 中的 Form 需要 GlobalKey?【英文标题】:Why does a Form need a GlobalKey in Flutter?为什么 Flutter 中的 Form 需要 GlobalKey? 【发布时间】:2021-08-16 18:53:09 【问题描述】:

https://flutter.dev/docs/cookbook/forms/validation

他们在那个Form中使用了GlobalKey

从这里:https://api.flutter.dev/flutter/widgets/GlobalKey-class.html

全局键唯一标识元素。全局密钥提供访问 与这些元素关联的其他对象,例如 构建上下文。对于 StatefulWidgets,全局键也提供了访问 状态。

具有全局键的小部件在它们的子树中重新生成它们的子树 从树中的一个位置移动到树中的另一个位置。 为了重新设置它的子树,一个小部件必须到达它的新的 树中的位置在它所在的同一动画帧中 从树中的旧位置移除。

使用全局键重新设置元素的成本相对较高,因为 此操作将触发对 State.deactivate 的调用 联系国及其所有后代;然后强制所有小部件 这取决于要重建的 InheritedWidget。

如果您不需要上面列出的任何功能,请考虑使用 改为 Key、ValueKey、ObjectKey 或 UniqueKey。

该表单中使用了上述引用中的哪个功能需要GlobalKey? 为什么那里需要 GlobalKey,为什么其他任何密钥都不起作用?

【问题讨论】:

这是因为他们需要FormState,并且他们通过key.currentState 获得 - 你也可以通过调用Form.of 静态方法获得FormState 【参考方案1】:

我认为GlobalKey 上使用的重要功能是formKey.currentState.validate() 方法,用于验证Form 中的所有TextFormField 小部件。因为GlobalKey可以访问FormState的当前状态。

ValueKey等其他密钥类型中无法访问FormState的当前状态。

【讨论】:

以上是关于为啥 Flutter 中的 Form 需要 GlobalKey?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要 Flutter 中的 InheritedWidget

为啥 Flutter 运行需要永远?

为啥我的 Flutter 应用中的 FAB 很大?

为啥我们需要使用 Android Studio 来构建 Flutter 应用? [关闭]

为啥 Flutter 中的 BloCListener 不保存状态,认证过程中出现 setState() 问题?

为啥我们在 Flutter/Dart 中的 catch 参数中加上“e”?