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

我正在学习 Udacity 的 flutter 类(class)。 有这个构造函数调用。

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

最佳答案

什么是键?

让我们来看看key documentation你链接了..

A Key is an identifier for Widgets, Elements and SemanticsNodes.

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

key 有什么用?

A new widget will only be used to update an existing element if its key is the same as the key of the current widget associated with the element.

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

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

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

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

Keys must be unique amongst the Elements with the same parent.

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

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

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

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

https://stackoverflow.com/questions/50428455/

相关文章:

java - Flutter 无法从 url 加载图片

mobile - Dart:流与 ValueNotifiers

flutter - 如何在 flutter 的文本小部件中显示图标?

dart - CustomScrollView 中的 Flutter 固定按钮

c# - 将 Flutter 前端与 Android 和 iOS 的 .NET Core 后端相结合

dart - flutter 列不展开

dart - 在 Flutter 中保持响应的同时制作持久的背景图像

dart - 如何为屏幕设置不同的主题?

ios - flutter : Not Connecting to IOS Simulator in

javascript - Flutter 是否使用 Javascript 引擎之类的东西,例如 Re