代码之家  ›  专栏  ›  技术社区  ›  MAA

构造函数中的关键参数是什么[重复]

  •  4
  • MAA  · 技术社区  · 8 年前

    这个问题已经有了答案:

    我在做乌达西颤振课程。 有一个构造函数调用。

      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 但我什么都不明白。这个页面没有上下文,也没有我可以使用的示例。

    1 回复  |  直到 8 年前
        1
  •  8
  •   Edman    8 年前

    什么是钥匙?

    让我们通过 key documentation 你链接了..

    键是小部件、元素和语义节点的标识符。

    很酷,小部件有一个标识符,这就是 Key . 容易的。

    什么是钥匙?

    只有当一个新的小部件 键与当前与 元素。

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

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

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

    键标识一个小部件,这告诉flutter一个小部件是应该被充气成新的,还是应该在构建期间替换树中的现有小部件。

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

    现在这变得很明显,因为如果这个小部件的键不是唯一的,我们就不知道它属于哪个状态。你自己试试!用两个小部件创建一列,并给它们相同的键。剧透警报:颤振会抱怨,你现在知道为什么了:)

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

    为了完整性,这里最后一点是关于本地和全局键。普通的 钥匙 很可能是 LocalKey 这只需要在它的兄弟姐妹中是独一无二的。如果您想要为一个在改变树的父对象周围移动的小部件保留状态,那么您需要 GlobalKey .

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