Dart:Map.update error";未捕获错误:TypeError:type';(动态)=>;num';不是类型为';(字符串)=>;字符串'&引用;
我有一个地图列表作为一组数据(Dart:Map.update error";未捕获错误:TypeError:type';(动态)=>;num';不是类型为';(字符串)=>;字符串'&引用;,dart,Dart,我有一个地图列表作为一组数据(dataMap),希望使用Map.update方法进行如下转换。这捕获到一个错误:Uncaught error:TypeError:Closure'main\uu convertIdFromStringToDocRef\u Closure':type'(dynamic)=>num'不是type'(String)=>String'的子类型。我应该误解一些关于Map.update,但我不确定它是什么。。。你能教我吗 void main() { num _conver
dataMap
),希望使用Map.update
方法进行如下转换。这捕获到一个错误:Uncaught error:TypeError:Closure'main\uu convertIdFromStringToDocRef\u Closure':type'(dynamic)=>num'不是type'(String)=>String'
的子类型。我应该误解一些关于Map.update
,但我不确定它是什么。。。你能教我吗
void main() {
num _convertStringToNum(dynamic str, String collection) {
if (str is String) { return num.tryParse(str); }
if (str is num) { return str; }
return null;
}
Map<String, dynamic> _convertIdFromStringToNum(Map<String, dynamic> map, String collection) {
map.update('id', (mapId) => _convertStringToNum(mapId, collection));
return map;
}
Map<String, dynamic> dataMap = {
'types': [
{
'id': '123',
'name': 'foo',
},
{
'id': '234',
'name': 'bar',
}
],
};
dataMap.update('types', (types) {
if (!(types is List<Map<String, dynamic>>)) { return null; }
types.map((Map<String, dynamic> type) => _convertIdFromStringToNum(type, 'types')).toList();
return types;
});
}
void main(){
num _convertStringToNum(动态str,字符串集合){
如果(str是String){return num.tryParse(str);}
如果(str是num){return str;}
返回null;
}
映射_convertIdFromStringToNum(映射映射,字符串集合){
map.update('id',(mapId)=>\u convertStringToNum(mapId,collection));
返回图;
}
映射数据映射={
“类型”:[
{
'id':'123',
'name':'foo',
},
{
'id':'234',
'name':'bar',
}
],
};
dataMap.update('类型',(类型){
如果(!(类型为列表)){returnnull;}
types.map((map type)=>\u convertIdFromStringToNum(type,'types')).toList();
返回类型;
});
}
这段代码可以在DartPad上运行。我和你一样也遇到了奇怪的问题 似乎如果使用
String
初始化映射条目,则无法将其修改为num
:
Map<String, dynamic> item = {
"id": "123",
"name": "TEST"
};
// this throws exception that `item['id']` has `String` value and we are trying to replace it with `num`
item['id'] = num.tryParse(item['id']);
在使用.map
迭代列表时,我正在创建类型的实例
并调用toMap
方法,该方法返回唯一的对象
void main() {
Map<String, dynamic> dataMap = {
'types': [
{
'id': 111,
'name': 'foo',
},
{
'id': '123',
'name': 'foo',
},
{
'id': '234',
'name': 'bar',
}
],
};
dataMap['types'] = (dataMap['types'] is List<Map>)
? dataMap['types'].map((type) => Type.fromMap(type).toMap())
: null;
print(dataMap);
}
void main(){
映射数据映射={
“类型”:[
{
id:111,,
'name':'foo',
},
{
'id':'123',
'name':'foo',
},
{
'id':'234',
'name':'bar',
}
],
};
dataMap['types']=(dataMap['types']是列表)
?数据映射['types'].map((类型)=>type.fromMap(类型).toMap())
:null;
打印(数据地图);
}
我自己找到了解决方案。(但仍不清楚真正的原因……)
问题出在.map(MapEntry f(K键,V值))
方法上。该方法的参数是一个函数MapEntry f(K键,V值)
,如代码中所述,我希望键上的Map
,但实际上它是JsLinkedHashMap
(值是字符串
)。当我试图通过map.update('id',(mapId)=>\u convertStringToNum(mapId,collection))分配非字符串值时
在函数\u convertIdFromStringToNum
中,它抛出异常
所以我改变了代码如下。我创建了一个新的Map
(newMap
),然后对其执行.update()
)
void main() {
num _convertStringToNum(dynamic str, String collection) {
if (str is String) { return num.tryParse(str); }
if (str is num) { return str; }
return null;
}
Map<String, dynamic> _convertIdFromStringToNum(Map<String, dynamic> map, String collection) {
final Map<String, dynamic> newMap = Map<String, dynamic>.from(map);
newMap.update('id', (mapId) => _convertStringToNum(mapId, collection));
return newMap;
}
Map<String, dynamic> dataMap = {
'types': [
{
'id': '123',
'name': 'foo',
},
{
'id': '234',
'name': 'bar',
}
],
};
dataMap.update('types', (types) {
if (!(types is List<Map<String, dynamic>>)) { return null; }
return types.map((Map<String, dynamic> type) => _convertIdFromStringToNum(type, 'types')).toList();
});
}
void main(){
num _convertStringToNum(动态str,字符串集合){
如果(str是String){return num.tryParse(str);}
如果(str是num){return str;}
返回null;
}
映射_convertIdFromStringToNum(映射映射,字符串集合){
最终映射newMap=Map.from(映射);
update('id',(mapId)=>\u convertStringToNum(mapId,collection));
返回newMap;
}
映射数据映射={
“类型”:[
{
'id':'123',
'name':'foo',
},
{
'id':'234',
'name':'bar',
}
],
};
dataMap.update('类型',(类型){
如果(!(类型为列表)){returnnull;}
返回类型.map((map type)=>\u convertIdFromStringToNum(type,'types')).toList();
});
}
请提供:\u convertIdFromStringToDocRef
或尝试以下操作:\u convertIdFromStringToDocRef(type['id','types')
因为它需要id
作为string
(请参阅错误消息)很抱歉输入错误,\u convertIdFromStringToDocRef
应该是\u convertidFromStringToDromTonum
。我修改了问题。请尝试解决方案:\u convertIdFromStringToDocRef(type['id','types')
谢谢,但它失败了,出现了一个错误未捕获的错误:TypeError:“123”:type'JSString'不是“Map”类型的子类型。
。我有两个函数,第二个函数带有参数(Map,String)
。你能在问题中解释一下你想要实现什么吗?您想将编号的id
值转换为number
?非常感谢!您的第一个代码片段没有出现异常,tryParce()
已成功将DartPad上的字符串修改为num。。。但你的解决方案也很有效。我仍然想知道我的代码不起作用的原因,但这可能是解决方案。
void main() {
num _convertStringToNum(dynamic str, String collection) {
if (str is String) { return num.tryParse(str); }
if (str is num) { return str; }
return null;
}
Map<String, dynamic> _convertIdFromStringToNum(Map<String, dynamic> map, String collection) {
final Map<String, dynamic> newMap = Map<String, dynamic>.from(map);
newMap.update('id', (mapId) => _convertStringToNum(mapId, collection));
return newMap;
}
Map<String, dynamic> dataMap = {
'types': [
{
'id': '123',
'name': 'foo',
},
{
'id': '234',
'name': 'bar',
}
],
};
dataMap.update('types', (types) {
if (!(types is List<Map<String, dynamic>>)) { return null; }
return types.map((Map<String, dynamic> type) => _convertIdFromStringToNum(type, 'types')).toList();
});
}