Flutter 2.5.0及以上版本调用compute时出现Isolate FunctionType参数非法错误
Flutter 2.5.0+ Isolate compute方法Illegal argument报错解决方案
问题原因
Flutter 2.5.0版本对Isolate跨线程消息传递的序列化校验做了收紧:仅允许纯可序列化数据类型在Isolate之间传递,禁止传递包含函数引用、上下文绑定的对象。你遇到的报错本质是传入compute方法的参数中包含了隐含Function类型的对象:
Unhandled Exception: Invalid argument(s): Illegal argument in isolate message : (object is a FunctionType)
你传入的Map参数中的自定义对象是问题高发点,大概率该类内部包含方法引用、回调属性,或者没有完全实现纯数据序列化逻辑。
修复方案
- 方案1:传递参数前先将所有自定义类型转成纯Map/JSON结构
传入compute之前先调用自定义类的序列化方法剥离所有非数据属性,Isolate内部处理时再反序列化转回对应类型,返回主Isolate的结果也需要做相同的序列化处理。
修正后的代码示例:Future<Map> callReportSubmit(Map myMap) { // 提前序列化自定义对象,仅传递纯数据 myMap['customObj'] = myMap['customObj'].toJson(); return compute(submitReport, myMap); } // submitReport内部先反序列化再处理 Map submitReport(Map param) { CustomObj obj = CustomObj.fromJson(param['customObj']); // 原有业务逻辑... // 返回结果同样序列化后再回传 return result.toJson(); } - 方案2:校验
compute调用的目标函数
确认submitReport是纯顶层函数或静态方法,没有捕获任何外层作用域的非全局变量,不存在隐式的上下文绑定。 - 方案3:排查参数中的不可序列化字段
如果找不到问题字段,可以逐个移除Map中的属性做排除测试,优先排查第三方库返回的对象、自定义业务类,这两类最容易隐含不可序列化的Function类型属性。
内容的提问来源于stack exchange,提问作者Bunn1
相关产品推荐
相关产品推荐

