Flutter中如何使用compute调用无参非高阶函数?
Flutter compute 调用无参函数的正确写法
问题原因
compute 是Flutter用于开启短生命周期隔离区执行耗时任务的内置方法,它的函数签名固定要求传入两个必填参数:
- 第一个参数:隔离区内要执行的回调函数
- 第二个参数:需要传递给回调函数的入参值
这个参数位是语法强制要求的,哪怕目标执行函数不需要任何入参,也不能留空。
可行解决方案
方案1:给无参函数增加占位参数
直接给原无参函数加一个不会被实际使用的形参,调用时随便传一个占位值(比如null、空字符串、0都可以)即可:
// 改造原无参函数,增加不会被使用的占位参数 Future<List<dynamic>> getTimeZones(void unusedParam) async { Uri url = Uri.parse(ApiConstants.instance.baseUrl); var res = await http.get(url); if (res.statusCode != 200) throw Exception('Bir hata oluştu.'); return jsonDecode(res.body); } // 调用时传null占住入参位 @override void init() async{ changeLoading(); final timeZones = await compute(getTimeZones, null); changeLoading(); }
方案2:包裹一层匿名转发函数(无需修改原函数)
如果不想改动原有函数的定义,可以在调用compute时写一层匿名闭包作为入口,闭包接收占位参数后内部直接调用原无参函数,同样传null占住入参位即可:
@override void init() async{ changeLoading(); // 闭包接收占位参数_,内部直接调用原无参方法 final timeZones = await compute((_) => getTimeZones(), null); changeLoading(); }
注意事项
传给compute的执行回调必须是顶层函数、静态方法,不能是类实例的私有闭包方法,否则会出现隔离区无法访问函数引用的报错。
内容的提问来源于stack exchange,提问作者yazicifatihcan
相关产品推荐
相关产品推荐

