【问题标题】:How to 'multitype' fixed-order, fixed-length list in Dart如何在 Dart 中“多输入”固定顺序、固定长度的列表
【发布时间】:2021-07-04 04:02:09
【问题描述】:

在我的 Flutter 项目中,我启用了 lint 包。在我的代码中,我有一张地图Map<String, List<dynamic>> options = ...;。该列表被键入为动态的,但实际上它始终是一个不可增长的长度为 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 变量,所以我想知道是否可以显式键入不可增长的固定类型列表,例如通过写类似List<String, IconData> 的东西。我尝试了一些直观的语法,但都没有奏效,而且我在互联网上找不到任何东西。

【问题讨论】:

    标签: list flutter dart typing


    【解决方案1】:

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

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

    class StringIconDataRelation {
      final String string;
      final IconData iconData;
    
      const StringIconDataRelation(this.string, this.iconData);
    }
    

    或者,您可以创建一个通用的Pair 类,可以在您的项目中使用:

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

    然后您可以将您的options 设置为Map&lt;String, Pair&lt;String, IconData&gt;&gt; 类型。

    一般来说,通常建议为关系创建特定的类,因为它可以使代码更清晰,并且您可以实现其他相关方法。但如果是为了简单的东西,使用Pair 类通常是没有问题的。

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

    【讨论】:

    • 感谢您提供的示例!这应该适用于我的用例。我也会继续关注 Dart 元组的支持。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2017-04-08
    相关资源
    最近更新 更多