我可以使用mymap['status']
访问第一个维度,但是我尝试使用mymap['status'].start
或mymap['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>
答案 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"
)。 Map
和List
的唯一常见超类型是Object
,因此您的地图是Map<String, Object>
。
当您随后编写mymap['status']
时,会得到一个静态类型为Object
的表达式,并且您不允许对此进行['start']
(Object
没有{ {1}}运算符)。
如果将变量键入为[]
,则可以执行Map<String, dynamic>
。最终的索引操作是 dynamic 调用,需要一些运行时开销。
或者,您可以执行mymap['status']['start']
,将查询到的值转换为正确类型的映射,然后在该映射上进行类型正确的查找。