如何在 Dart 中 'multitype' fixed-order, fixed-length 列表

How to 'multitype' fixed-order, fixed-length list in Dart

在我的 Flutter 项目中,我启用了 lint 包。在我的代码中的某处,我有一张地图 Map<String, List<dynamic>> options = ...;。 List 类型为动态,但实际上它始终是一个 non-growable,长度为 2 的列表 [String, IconData]。我使用地图如下:

options.entries
    .map((e) => SwitchListTile(
          title: Text(e.value[0].toString()),
          secondary: Icon(e.value[1]),
          value: notificationSettings[e.key],
          onChanged: (bool value) => onNotificationChanged(topic: e.key, enabled: value),
        ))
    .toList());

即列表中的 String 是 listTile 的标题,IconData 是要显示的图标,地图键给 notificationSettings 以获取当前设置,以及到更新设置的 onNotificationChanged 处理程序。

linter 说我不应该在我使用 e.value[i] 的地方使用 dynamic 变量,所以我想知道是否有一个 non-growable、fixed-type 列表可以显式输入,例如通过写类似 List<String, IconData> 的东西。我尝试了一些直观的语法,但 none 有效,而且我在互联网上找不到任何东西。

Dart 目前不支持元组,但正在讨论中。

现在,您应该像这样为您的数据对创建一个特定的 class(请给它一个更好的名称来描述目的:)):

class StringIconDataRelation {
  final String string;
  final IconData iconData;

  const StringIconDataRelation(this.string, this.iconData);
}

或者,您可以制作一个通用的 Pair class,它可以在您的项目中使用:

class Pair<T1, T2> {
  final T1 a;
  final T2 b;
  
  const Pair(this.a, this.b);
}

然后您可以让您的 options 具有类型 Map<String, Pair<String, IconData>>

一般来说,通常建议为关系创建特定的classes,因为这样可以使代码更清晰,并且可以实现其他相关方法。但是如果是简单的东西,使用Pair class.

往往不是问题

您还可以在 pub.dev 上找到很多包,它们为您提供不同维度的元组。