我应该在 Flutter Widget 上使用什么:“ValueKey”或“Key”

Car*_*iel 3 widget flutter

这周我又遇到了这个场景。

我一直在使用key: ValueKey(*aValue*),但没有特殊原因,考虑到使用可能key: Key(*aValue*)可以类似地工作。

在任何情况下,有什么最重要的原因或深刻理解使用它的原因吗?

小智 5

该类Key用于唯一标识小部件树中的小部件。当键需要基于对象的值而不是对象标识本身时,使用 的子ValueKey类。Key

ValueKey一般来说,当键需要基于对象的值时,建议使用。这是因为ValueKey使用对象的hashCode==方法来确定密钥,这可以确保即使使用不同的属性重新创建对象本身,密钥也保持不变。这对于由于状态变化而需要重建小部件树的情况很重要,因为使用ValueKey可以确保相应的小部件被正确更新。

另一方面,如果密钥只需要基于对象的身份,那么使用Key就足够了。当创建一个与之前的小部件具有不同状态的新小部件时,通常会出现这种情况。

总之,ValueKey当键需要基于对象的值时使用,Key当键只需要基于对象的标识时使用。


Say*_*d J 5

myMillionListOfProduct = [
Product(name:soap, price: 10.00),
Product(name:butter, price: 12.00),
...
];
Run Code Online (Sandbox Code Playgroud)

如果你想Key手动编写不同的内容是可以的,但如果你想动态创建它,那么就会出现一些问题:

Key我们可以这样使用:

products.map(product) => ProductWidget(key: Key(product.name),product: product);
Run Code Online (Sandbox Code Playgroud)

Key只接受String,如果有同名但价格不同的产品怎么办?dart 不高兴并告诉你:“密钥重复”。

然后为了让 dart 高兴我们可以使用ValueKey

products.map(product) => ProductWidget(key: ValueKey<Product>(product),product: product);
Run Code Online (Sandbox Code Playgroud)

也许有些人在他们的参考中创造了差异并添加到我们的myMillionListOfProduct.

final someguysoap = Product(name:soap,price:10.00).
myMillionListOfProduct.add(someguysoap);
Run Code Online (Sandbox Code Playgroud)

但是,又有一种具有相同价值的产品,Product(name: soap, price: 10.00)使用ValueKey会让 dart 再次不高兴。

那么我们就用ObjectKey它来代替。

myMillionListOfProduct = [
Product(name:soap, price: 10.00),
Product(name:butter, price: 12.00),
someguysoap,
...
];

products.map(product) => ProductWidget(key: ObjectKey(product),product: product);
Run Code Online (Sandbox Code Playgroud)

如果这个人再添加 1 个具有相同参考的产品怎么办?

myMillionListOfProduct = [
Product(name:soap, price: 10.00),
Product(name:butter, price: 12.00),
someguysoap,
someguysoap,
...
];
Run Code Online (Sandbox Code Playgroud)

然后 dart 会告诉你这些小部件有相同的 objectKey。如果你希望这样的事情发生

UniqueKey代替使用。