我正在做Udacity扑动课程。 有这个构造函数调用。
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 I presume)的父项呢?
我看了Key class,但我什么都不懂。此页面中没有上下文或我可以使用的示例。
答案 0 :(得分:6)
让我们浏览你所链接的key documentation ..
Key是Widgets,Elements和SemanticsNodes的标识符。
酷,小部件有一个标识符,那就是Key
。容易。
新窗口小部件仅用于更新现有元素 key与当前窗口小部件的关键字相同 元件。
现在这有点神秘了,让我们把它分解。
这里发生的事情是,当状态发生变化并且您的小部件树正在重建时,颤动需要一种方式来了解:
密钥标识一个小部件,这告诉我们是否应该对一个小部件进行新的膨胀,或者它是否应该在构建期间替换树中的现有小部件。
在具有相同父级的元素中,键必须是唯一的。
现在这变得很明显,因为如果它的键不是唯一的,我们无法知道哪个状态属于这个小部件。亲自尝试一下!创建一个包含两个小部件的列,并为它们提供相同的密钥。剧透警报:颤动会抱怨,你现在知道为什么:)
为了完整起见,这里要做的最后一点是关于本地和全局密钥。常规Key
很可能是LocalKey
,这个兄弟姐妹只需要独一无二。如果你想保持一个小部件的状态,这个小部件在树上移动父母,那么你正在寻找一个GlobalKey
。
此外,flutter使用对象的类型(如Object.runtimeType
)以及在构建期间识别小部件的键。这就是为什么你经常根本没有指定一个键并且事情仍然有效,因为这些可能是LocalKeys
并且你可能在同一个父级下没有两个相同runtimeType
的小部件,所以即使他们碰巧有相同的默认密钥,他们仍然不会发生冲突。