【问题标题】:what is Key parameter in the constructor [duplicate]构造函数中的关键参数是什么[重复]
【发布时间】:2018-10-29 21:45:28
【问题描述】:

我正在学习 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)?

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

【问题讨论】:

    标签: flutter


    【解决方案1】:

    什么是键?

    让我们看看你链接的key documentation..

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

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

    钥匙有什么用?

    一个新的小部件将仅用于更新现有元素,如果它 key 与关联的当前小部件的 key 相同 元素。

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 大量文字,但最终并没有真​​正解释它的用途。最后这个问题只是stackoverflow.com/questions/50080860/…的重复
    • 我非常有信心这可以回答什么是键。如果您以前看过类似的问题,请标记重复的问题。
    • 是的,但它没有回答 OP 问题 why is the parent of the category widget class (StatelessWidget I presume) is being passed it?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多