为啥 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
为啥我们需要使用 Android Studio 来构建 Flutter 应用? [关闭]