我在上UdacityFlutter 课程.

  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);

无视这些主张和要求.您使用三个参数调用,因此构造函数必须有三个参数.

但是,在本练习的解决方案文件中,教师是这样做的.

  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);

这个关键参数是什么?为什么类别widget类(我猜是无状态widget)的父类会被传递给它?

我看了Key class,但是我什么都不懂.这个页面没有上下文,也没有我可以使用的例子.

推荐答案

什么是 keys ?

让我们判断一下您链接的key documentation个..

键是小部件、元素和语义 node 的标识符.

酷,小工具有一个标识符,那就是Key.轻松点.

keys 是用来做什么的?

一个新的小部件将只用于更新一个现有的元素,如果它是

现在这个更隐晦了,让我们来分析一下.

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

  • 哪些小部件是全新的,需要为它们创建一个新状态;
  • 或者最有趣的是,哪些小部件并不是真正的新部件,比如Flitter已经有了一个应该与之关联的状态对象.毕竟,这就是为什么小部件/状态在Flutter 中是分开的,所以当视图改变、设置动画、旋转等时,状态仍然存在.

该键标识一个小部件,它告诉Flotter一个小部件是应该inflating 为新的,还是应该在构建期间替换树中现有的小部件.

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

现在,这一点变得显而易见,因为如果小部件的键不是唯一的,我们就无法知道哪个州属于该小部件.你自己试试吧!创建一个包含两个小部件的列,并为它们提供相同的键.剧透提示:Ffltter会抱怨,现在您知道原因了:)

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

为了完整性起见,这里要提出的最后一点是关于本地和全局密钥的.一个普通的Key很可能是LocalKey,这只需要在它的sibling 姐妹中是独一无二的.如果你想保留一个小部件的状态,这个小部件在树的周围移动,改变父母,那么你需要一个GlobalKey.

此外,Flatter在构建过程中使用对象的类型(如Object.runtimeType中所示)以及键来识别小部件.这就是为什么你经常根本不指定一个键,而这些东西仍然有效,因为它们很可能是LocalKeys,而且你可能在同一个父项下没有相同runtimeType的两个小部件,所以即使它们碰巧有相同的默认键,它们也不会冲突.

Flutter相关问答推荐

使用Bg晃动背景图像边界

飘动的文本用/字符绕转

Flutter ReorderableListView在可滚动父级中无法完美工作

Flutter:InteractiveViewer中可伸缩SVG背景上的定位小部件不对齐

Flutter:sqflite DB

我如何才能收到每天重复的预定通知?

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

我怎样才能go 掉这个底部导航栏上的白色背景

DART:如何判断有时可以为空的泛型类型?

在使用FutureProvider时,我想显示用于加载的指示器,但无法自定义大小

创建仅定义导出的文件是否有意义?

Firestore 使用 Flutter 以奇怪的格式保存数据

如何设置行中项目之间的空格相等?

Flutter blue plus 库,当try 从 esp32 驱动程序获取 PlatformException 时读取特性

如何从另一个页面访问 Firebase 值?

graphql_flutter 错误:非抽象类GraphQLWebSocketChannel缺少实现

如何在两个不同的路由(屏幕)之间正确设置 BlocProvider?

Android: 从 URI 获取音频元数据

如何将 void 函数放入单独的 dart 文件的单独页面中

在 flutter 中使用 StreamBuilder 在文本字段中键入时显示过滤记录