类型“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&lt;Object?&gt;' is not a subtype of type 'List&lt;BLECharacteristic&gt;' 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&lt;Object?&gt; 而不是 List&lt;BLECharacteristic&gt;。所以下面的代码可能对你有用(未经测试):

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()
  );

您能否展示BLECharacterticfromMaptoMap 方法,以便更好地理解问题。

【讨论】:

感谢您的快速响应 :) 我在原始帖子中添加了请求的功能以获得更好的可见性。与此同时,我会测试你的建议。此解决方案不起作用,因为底层 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 类转换异常

List<Object> 和深拷贝

Firebase 快照中的 Stream<List<Object>> 是不是会在节点的每次更改时返回整个节点?扑

如何使用 List<object> 的 IndexOf() 方法