Builder与GlobalKey

Der*_*kin 7 flutter flutter-layout

与构建Flutter UI相关的许多问题都归结为错误BuildContext(例如显示a SnackBar).答案通常提供使用Builder或使用GlobalKey.两者都有效,但我注意到GlobalKey的文档说明:

全局密钥相对昂贵.如果你不需要任何的上面列出的特征,可以考虑使用Key,ValueKey,ObjectKey,或UniqueKey代替.

所提到的特征是唯一标识和子树重新父母.在GlobalKey这些情况下使用a的"相对费用"是否足以使用a Builder

Rém*_*let 10

我们倾向于避免的真正原因GlobalKey与性能无关。它与以下事实更为相关:它会打乱一些图案。

根据定义,小部件不应能够访问其他小部件的具体信息(例如其大小或位置)。并GlobalKey授予访问此类信息的能力;允许人们做反模式的东西。

可以认为GlobalKey弹出 Flutter反应层的一种手段。

人们尝试使用GlobalKey以下方法做的一些例子:

  • 公开单身GlobalKey。用来表示不提起国家的手段。使得小部件之间的交互变得难以预测,因为这种关系不再是单面的(父级->子级变为双向关系)
  • 使用GlobalKey来计算布局的大小。然后使用此信息触发重新渲染。相反,这是RenderObject小部件中的角色,不应在小部件中完成。这使得布局难以维护

Builder另一方面,类似的东西不会破坏这些模式。按照定义Builder什么没有做。这只是使用其他方法的一种巧妙方法BuildContext

这通常意味着,如果您可以使用Builder而不是来解决布局问题GlobalKey,那么您将走上可维护布局的正确轨道。


什么时候使用GlobalKey呢?

好吧,如果可以的话,永远不要。尝试改为使用诸如context.ancestorStateOfTypecontext.inheritWidgetOfExtactType。您可能还需要考虑RenderObject为特定布局创建自定义。如果您需要父母/孩子之间的关系RenderObjectparentData则也可以与结合

但是,这可能更加复杂。它可能消耗比您想要的更多的时间。否则您可能陷入使用当前API难以实现的极端情况。

在这种情况下,GlobalKey只要知道潜在的后果就可以使用。


Gün*_*uer 9

GlobalKey昂贵最有可能与您可能需要大量密钥的情况有关,例如ListView.

我怀疑遗嘱的成本GlobalKeySnackBar重要。您不太可能创建很多。

  • 我想是这样。不要将 GlobalKey 用于包含数百个项目的列表中的项目。 (2认同)