gpt4 book ai didi

flutter - 构造函数中的 Key 参数是什么

转载 作者:IT老高 更新时间:2023-10-28 12:39:37 25 4
gpt4 key购买 nike

我正在学习 Udacity 的 flutter 类(class)。有这个构造函数调用。

  child: Category(
name: _categoryName,
color: _categoryColor,
iconLocation: _categoryIcon,
),

当我自己做这个的时候,我很自然地把构造函数写成这样:

 const Category({
@required this.name,
@required this.icon,
@required this.color
}) : assert(name != null),
assert(icon != null),
assert(color != null);

忽略断言和@requireds。你调用使用三个参数,所以构造函数必须有三个参数。

但是,在本练习的解决方案文件中,讲师是这样操作的。

  const Category({
Key key,
@required this.name,
@required this.color,
@required this.iconLocation,
}) : assert(name != null),
assert(color != null),
assert(iconLocation != null),
super(key: key);

这个关键参数是什么?为什么要传递类别小部件类的父类(我假设是 StatelessWidget)?

我看过 Key class ,但我什么都不懂。此页面中没有上下文或我可以使用的示例。

最佳答案

什么是键?

让我们来看看key documentation你链接了..

A Key is an identifier for Widgets, Elements and SemanticsNodes.

很酷,小部件有一个标识符,那就是 Key。很简单。

key 有什么用?

A new widget will only be used to update an existing element if its key is the same as the key of the current widget associated with the element.

现在这有点神秘,让我们分解一下。

这里发生的情况是当状态发生变化并且您的小部件树正在重建时,flutter 需要一种知道的方法:

  • 哪些小部件是全新的,需要为其创建新状态;
  • 或者最有趣的是,哪些小部件并不是真正的新小部件,以至于 Flutter 已经有了一个应该与之关联的状态对象。毕竟这就是为什么小部件/状态在 flutter 中是分开的,所以状态在 View 改变、动画、旋转等时仍然存在。

该键标识一个小部件,这告诉 Flutter 一个小部件是否应该被扩充为新的,或者它是否应该在构建期间替换树中的现有小部件。

Keys must be unique amongst the Elements with the same parent.

现在这变得很明显,因为如果它的键不是唯一的,我们就无法知道哪个状态属于这个小部件。自己试试吧!创建一个包含两个小部件的列并为它们提供相同的键。剧透警告: flutter 会提示,你现在知道为什么了:)

知道了,还有什么我应该知道的吗?

为了完整起见,这里要说明的最后一点是关于本地和全局键。常规 Key 很可能是 LocalKey ,这个只需要在它的 sibling 中是独一无二的。如果您想为在改变父级的树周围移动的小部件保留状态,那么您正在寻找 GlobalKey .

此外,flutter 使用对象的类型(如 Object.runtimeType 中的)以及在构建期间识别小部件的键。这就是为什么您通常根本不指定键并且事情仍然有效的原因,因为这些可能是 LocalKeys 并且您可能没有两个具有相同 runtimeType 的小部件在同一个父级下,因此即使它们碰巧具有相同的默认 key ,它们仍然不会发生冲突。

关于flutter - 构造函数中的 Key 参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50428455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com