gpt4 book ai didi

dart - Dart :Map.update错误 “Uncaught Error: TypeError: type '(动态)=> num'不是 '(String) => String'类型的子类型”

转载 作者:行者123 更新时间:2023-12-03 03:34:20 24 4
gpt4 key购买 nike

我有一组 map 列表作为一组数据(dataMap),并且想要使用Map.update方法进行如下转换。这捕获了一个错误:Uncaught Error: TypeError: Closure 'main__convertIdFromStringToDocRef_closure': type '(dynamic) => num' is not a subtype of 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;
});
}


此代码可以在DartPad上运行。

最佳答案

我也遇到了您的奇怪问题。

好像 map 条目是使用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']);

我通过使用构造函数创建自定义类找到了解决方法,该构造函数将输入转换为必要的字段类型:
class Type {
num id;
String name;

num convertToNum(dynamic input) {
switch (input.runtimeType) {
case int: break;
case num: break;
case String: return num.tryParse(input); break;
default: return null;
}
return input;
}

Type(id, name) {
this.id = convertToNum(id);
this.name = name;
}

static fromMap(Map map) {
return Type(map['id'], map['name']);
}

Map toMap() {
return {
"id": this.id,
"name": this.name
};
}
}

当使用 .map迭代列表时,我正在创建 Type的实例并调用 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);
}

关于dart - Dart :Map.update错误 “Uncaught Error: TypeError: type '(动态)=> num'不是 '(String) => String'类型的子类型”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61937217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com