You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Isolate.spawn方法传递对象列表?类型不匹配错误如何解决

问题排查与解决方案

错误根因

你的代码存在两处逻辑错误,共同导致了类型不匹配报错:

  • 发送端序列化逻辑错误:你先调用了sl.toString()将列表转为普通描述字符串,再执行jsonEncode,最终得到的sls是字符串的序列化结果,不是列表结构的序列化数据。
  • 接收端反序列化逻辑错误:jsonDecode返回的是List<dynamic>类型,内部元素为键值对Map结构,无法直接赋值给List<myContactsModel>类型的变量,需要手动转换为自定义模型对象。

修复步骤

步骤1:完善自定义模型类的序列化方法

给myContactsModel新增toJson和fromJson方法,支持序列化与反序列化:

class myContactsModel {
  final String name;
  final String age;

  myContactsModel({required this.name, required this.age});

  // 序列化用toJson
  Map<String, dynamic> toJson() => {
    'name': name,
    'age': age,
  };

  // 反序列化用fromJson工厂方法
  factory myContactsModel.fromJson(Map<String, dynamic> json) => myContactsModel(
    name: json['name'],
    age: json['age'],
  );
}

步骤2:修改发送端序列化逻辑

去掉toString()调用,直接将列表对象传入jsonEncode:

List<myContactsModel> sl = [myContactsModel(name:'ABcde', age:'34')];
// 移除.toString()调用,直接序列化列表
var sls = jsonEncode(sl);
Map map = {
  "sendPort": receivePort.sendPort,
  "listContacts": sls,
};

isolate = await Isolate.spawn(sayHello, map);

步骤3:修改接收端反序列化逻辑

先把jsonDecode的结果转成动态列表,再遍历转换成myContactsModel对象:

static void sayHello(Map map) async{
  var sp = map['sendPort'];
  // 先获取反序列化后的动态列表
  List<dynamic> jsonList = jsonDecode(map['listContacts']);
  // 遍历转换为自定义模型对象
  List<myContactsModel> listContacts = jsonList.map((item) => myContactsModel.fromJson(item)).toList();
  sp.send("Hello from Isolate");
}

可选优化

当前Dart版本的Isolate支持直接传递自定义对象(不需要JSON序列化),只要对象没有携带闭包、套接字等跨隔离域不可传递的资源,你可以直接把列表放入Map传递,省去序列化/反序列化的开销:

// 发送端直接传列表,不需要jsonEncode
Map map = {
  "sendPort": receivePort.sendPort,
  "listContacts": sl,
};

// 接收端直接取值即可
List<myContactsModel> listContacts = map['listContacts'];

内容的提问来源于stack exchange,提问作者Benson OO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:36:06