Flutter运行报LateInitializationError: _recognitions字段未初始化问题
Flutter项目LateInitializationError: Field '_recognitions' 未初始化报错修复方案
报错根因
代码中使用late关键字声明了_recognitions变量,该关键字的规则是:变量必须在第一次被读取前完成手动赋值,否则直接抛出LateInitializationError。
现有逻辑的问题:
- 页面首次执行
build方法渲染BoundingBox组件时,就会直接读取_recognitions的值作为传参 - 但
_recognitions的赋值逻辑只写在setRecognitions回调里,这个回调要等相机预览启动、TFLite模型完成首次推理后才会触发,时机远晚于首次页面渲染 - 代码中写的
// ignore: unnecessary_null_comparison注释对该场景无效,因为late变量未赋值时读取会直接抛错,不会进入空值判断逻辑
修复方法
- 修改变量声明,移除
late关键字,给_recognitions设置合法的初始默认值,替换原有变量声明行:
将原代码:
替换为:late List<dynamic> _recognitions;List<dynamic> _recognitions = []; - 删除
BoundingBox传参上方无实际作用的// ignore: unnecessary_null_comparison注释即可。修改后首次渲染时_recognitions是空数组,不会触发报错,等模型推理回调触发后会自动通过setState刷新边框渲染结果。 - 可选优化:如果不希望识别结果为空时渲染边框组件,可以修改Stack的子组件逻辑,增加判断:
children: <Widget>[ CameraFeed(widget.cameras, setRecognitions), if (_recognitions.isNotEmpty) BoundingBox( _recognitions, math.max(_imageHeight, _imageWidth), math.min(_imageHeight, _imageWidth), screen.height, screen.width, ), ],
注意:
late关键字仅适合用于一定会在初始化阶段、被读取前完成赋值的变量,依赖异步回调、交互事件才会赋值的变量不要用late修饰,直接给初始默认值或声明为可空类型即可避免这类报错。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

