You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:54:22