如何向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
相关产品推荐
相关产品推荐

