类型“List<Object?>”不是类型转换中“List<>”类型的子类型
Posted
技术标签:
【中文标题】类型“List<Object?>”不是类型转换中“List<>”类型的子类型【英文标题】:type 'List<Object?>' is not a subtype of type 'List<>' in type cast 【发布时间】:2021-12-30 06:14:06 【问题描述】:我想做的是在 Flutter 和 android 之间进行通信。为此,我使用 EventChannel 和 MethodChannel。由于编解码器的限制,我需要在将 Android 数据发送到 Flutter 之前将其包装在 HashMap 中。在 Flutter 方面,我试图将其解包以显示在简单的 ListView 中。但是,我无法弄清楚类型转换的问题
factory BLEService.fromMap(Map<String, dynamic> map) => BLEService(
map['uuid'] as String,
(map['characteristics'] as List<BLECharacteristic>)
.map<BLECharacteristic>((e) =>
BLECharacteristic.fromMap(e as Map<String, BLECharacteristic>)
).toList()
);
对于这一行,抛出以下异常:type 'List<Object?>' is not a subtype of type 'List<BLECharacteristic>' in type cast
非常感谢帮助解决这个问题
编辑 Flutter BLECharacteristic.fromMap
factory BLECharacteristic.fromMap(Map<String, dynamic> map) => BLECharacteristic(
map['uuid'] as String,
);
Java BLECharacteristic.toMap
HashMap<String, Object> toMap()
HashMap<String, Object> bleCharacteristicMap = new HashMap<>();
bleCharacteristicMap.put("uuid", uuid);
return bleCharacteristicMap;
【问题讨论】:
你能说明 map['characteristics'] 返回什么吗? "特征":["uuid":"00002a00-0000-1000-8000-00805f9b34fb","uuid":"00002a01-0000-1000-8000-00805f9b34fb", "uuid":"00002a02-0000-1000-8000-00805f9b34fb","uuid":"00002a04-0000-1000-8000-00805f9b34fb"],"uuid":"00001800-0000-1000-8000- 00805f9b34fb" 【参考方案1】:在 Flutter 中,map['characteristics']
将返回 List<Object?>
而不是 List<BLECharacteristic>
。所以下面的代码可能对你有用(未经测试):
factory BLEService.fromMap(Map<String, dynamic> map) => BLEService(
map['uuid'] as String,
(map['characteristics'] as List)
?.map((e) =>
BLECharacteristic.fromMap(e as Map<String, dynamic>)
).toList()
);
您能否展示BLECharactertic
的fromMap
和toMap
方法,以便更好地理解问题。
【讨论】:
感谢您的快速响应 :) 我在原始帖子中添加了请求的功能以获得更好的可见性。与此同时,我会测试你的建议。此解决方案不起作用,因为底层 HashMap 会出现相同的输入问题 我尝试在 DartPad 上运行它,它可以工作。这是link【参考方案2】:尝试此代码一次
List<BLECharacteristic> bleCharacteristicFromJson(List list) =>
List<BLECharacteristic>.from(
list.map((x) => BLECharacteristic.fromJson(x)));
class BLECharacteristic
BLECharacteristic(this.uuid);
String? uuid;
factory BLECharacteristic.fromJson(Map<String, dynamic> json) =>
BLECharacteristic(
uuid: json["uuid"],
);
这样称呼它
final data = bleCharacteristicFromJson(map["characteristics"]); // will return you list of BLECharacteristic
【讨论】:
【参考方案3】:最后我想出了一个有点hacky的方法来解决它:
var finalList = Map<String, dynamic>.from(jsonDecode(jsonEncode(data)))['SERVICESLIST'].map<BLEService>((e) => BLEService.fromMap(e)).toList();
不过,为了简单起见,我只是将 Android 实现更改为使用带有 gson 插件的 JSON 包装数据
【讨论】:
以上是关于类型“List<Object?>”不是类型转换中“List<>”类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章
把java两个list <object>集合 放到第三个list<object>集合中去
java 怎么将List<List<Object>>类型转换成json类型,怎么读取json类型
涉及 Hibernate 返回的 List<Object[]> 的 Java 类转换异常