Flutter向Java通信通道传值报null check operator used on a null value错误
问题原因及解决方案
- 参数名混淆错误:你在
MonitoramentoStatefulWidget中定义的属性名为cod,但展示文本的代码中使用的是widget.codigo,首先确认是否是代码书写笔误,如果确实存在两个属性,检查cod属性的赋值逻辑是否存在为空的情况。 - 可选参数未赋值为空:你的
cod是可选命名参数,未添加required修饰符:- 如果开启了空安全,未给非空类型的可选参数设置默认值或
required修饰,编译阶段就会报错,若你是强制关闭了编译校验运行,运行时cod未传值就会为空 - 如果未开启空安全,可选参数未传值时默认值为
null,调用toString()时不会报错(非空安全下null.toString()返回字符串null),但后续如果有逻辑对该参数做非空断言就会触发报错
- 如果开启了空安全,未给非空类型的可选参数设置默认值或
- MethodChannel实例未初始化:报错也可能来源于
platform_foto对象为空,你调用invokeMethod前未对MethodChannel实例做初始化赋值,就会触发空检查报错 - 异步调用时Widget已销毁:
onImageCapture是异步方法,如果触发该方法时当前页面已经被销毁,State持有的widget对象会变为空,此时访问widget.cod就会触发空报错
解决步骤
- 统一参数名,确认属性名是
cod还是codigo,修正代码中不一致的地方 - 给可选参数添加
required修饰符,或者设置默认值,确保参数不会为空:
// 方案1:添加required强制参数必传 const Monitoramento({required this.cod, ...}); // 方案2:设置默认值 const Monitoramento({this.cod = 0, ...});
- 检查
MethodChannel的初始化逻辑,确保platform_foto在调用前已经被正确赋值:
// 正确初始化示例,替换为你自己的通道名 static const platform_foto = MethodChannel('com.example.xxx/foto');
- 异步调用前先判断
mounted属性,确保组件还未被销毁,同时调整异常捕获范围覆盖所有错误类型:
onImageCapture() async { if (!mounted) return; try { await platform_foto.invokeMethod('onImageCapture', { "codigo": widget.cod }); } catch (e) { print(e); } }
空安全相关说明
Flutter 2.2.3已经原生支持空安全,开启空安全可以在编译阶段就提前发现空值问题,避免运行时出现空指针异常,建议你适配空安全模式。
内容的提问来源于stack exchange,提问作者E. Biagi
相关产品推荐
相关产品推荐

