Dart如何在多维地图中访问第二维

时间:2019-07-10 05:22:35

标签: flutter dart

我可以使用mymap['status']访问第一个维度,但是我尝试使用mymap['status'].startmymap['status']['start']访问第二个维度,但均无用。

我也看不出为什么mymap.status不适用于第一维?

const mymap = {
  'status': {
    'start': ['Start', 'ok', 'go'],
  },
  'update': {
    'now': ['Start', 'ok', 'go'],
  },
  'time': [
    ['20', '10s', '5s'],
         ['45', '30s', '15s']
  ]
};

也不确定该映射是否应具有数据类型Map,但是使用它mymap['status'].start时我没有收到错误信号,但是在执行代码时会抛出错误Class '_ImmutableMap<String, List<String>>' has no instance getter 'start' < / p>

2 个答案:

答案 0 :(得分:3)

要解决您的问题,请在Map之后使用静态类型const,如下所示:

const Map mymap = {
  'status': {
    'start': ['Start', 'ok', 'go'],
  },
  'update': {
    'now': ['Start', 'ok', 'go'],
  },
  'time': [
    ['20', '10s', '5s'],
         ['45', '30s', '15s']
  ]
};

 print(mymap['status']['start']);

如果需要https://dartpad.dartlang.org/20eab4288fbf688c6517365b89fc2b22

,则可以运行代码

答案 1 :(得分:0)

您使用Map在Dart map[key]中查找键的值。如果键是字符串,则为mymap["status"]。您不能使用mymap.status,因为映射键与类成员完全分开。这就是为什么您可以同时进行map["length"]map.length并获得不同结果的原因。

在您的示例中,mymap静态类型推断为Map<String, Object>。 可以推断出这是因为地图的Map<String, List<String>>(对于"status""update")还是List<List<String>>(对于"time" )。 MapList的唯一常见超类型是Object,因此您的地图是Map<String, Object>

当您随后编写mymap['status']时,会得到一个静态类型为Object的表达式,并且您不允许对此进行['start']Object没有{ {1}}运算符)。

如果将变量键入为[],则可以执行Map<String, dynamic>。最终的索引操作是 dynamic 调用,需要一些运行时开销。

或者,您可以执行mymap['status']['start'],将查询到的值转换为正确类型的映射,然后在该映射上进行类型正确的查找。