【问题标题】:type 'List<Object?>' is not a subtype of type 'List<>' in type cast类型“List<Object?>”不是类型转换中“List<>”类型的子类型
【发布时间】: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"}

标签: java android flutter dart


【解决方案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 包装数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2021-06-04
      • 2021-05-08
      • 2019-01-13
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多