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

时间:2018-05-19 18:48:16

标签: flutter

我正在做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,但我什么都不懂。此页面中没有上下文或我可以使用的示例。

1 个答案:

答案 0 :(得分:6)

什么是键?

让我们浏览你所链接的key documentation ..

  

Key是Widgets,Elements和SemanticsNodes的标识符。

酷,小部件有一个标识符,那就是Key。容易。

什么是键?

  

新窗口小部件仅用于更新现有元素   key与当前窗口小部件的关键字相同   元件。

现在这有点神秘了,让我们把它分解。

这里发生的事情是,当状态发生变化并且您的小部件树正在重建时,颤动需要一种方式来了解:

  • 哪些小部件是全新的,需要为它们创建新的状态;
  • 或者最有趣的是,哪些小部件并不是新的,因此颤动已经有一个应该与之关联的状态对象。毕竟这就是为什么小部件/状态在颤动时是分开的原因,所以当视图改变,动画,旋转等时状态仍然存在。

密钥标识一个小部件,这告诉我们是否应该对一个小部件进行新的膨胀,或者它是否应该在构建期间替换树中的现有小部件。

  

在具有相同父级的元素中,键必须是唯一的。

现在这变得很明显,因为如果它的键不是唯一的,我们无法知道哪个状态属于这个小部件。亲自尝试一下!创建一个包含两个小部件的列,并为它们提供相同的密钥。剧透警报:颤动会抱怨,你现在知道为什么:)

我还应该知道其他什么吗?

为了完整起见,这里要做的最后一点是关于本地和全局密钥。常规Key很可能是LocalKey,这个兄弟姐妹只需要独一无二。如果你想保持一个小部件的状态,这个小部件在树上移动父母,那么你正在寻找一个GlobalKey

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