Flutter相机CameraController未初始化报错LateInitializationError排查
Flutter相机页面LateInitializationError问题解决
问题原因
你用late关键字声明了cameraController,但startCamera是异步方法——initState调用它后会立刻执行后续代码并触发第一次build,此时cameraController还没完成赋值。build方法里直接访问cameraController.value.isInitialized,就会触发未初始化错误。虽然后续异步流程完成后控制器会被初始化并打印输出,但第一次build的错误已经发生了。另外dispose方法里直接调用cameraController.dispose()也存在同样的风险:如果控制器还没初始化页面就被销毁,会再次触发错误。
修复方案
将控制器改为可空类型,在使用前先判断是否已赋值,同时完善初始化和销毁逻辑:
class CameraPage extends StatefulWidget { const CameraPage({Key? key}) : super(key: key); @override State<CameraPage> createState() => _CameraPageState(); } class _CameraPageState extends State<CameraPage> { late List<CameraDescription> cameras; CameraController? cameraController; // 改为可空类型 @override void initState() { startCamera(); super.initState(); } void startCamera() async { try { cameras = await availableCameras(); final controller = CameraController( cameras[0], ResolutionPreset.high, ); cameraController = controller; await controller.initialize(); if (mounted) setState(() {}); } catch (e) { print("相机初始化失败: $e"); } } @override void dispose() { cameraController?.dispose(); // 先判断是否为空再销毁 super.dispose(); } @override Widget build(BuildContext context) { final controller = cameraController; if (controller != null && controller.value.isInitialized) { return Scaffold( body: Stack( children: [ CameraPreview(controller), ], ), ); } else { // 初始化过程中显示加载状态,替代空的SizedBox return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } } }
关键修改点
- 将
late CameraController cameraController改为CameraController? cameraController,避免late的强制初始化要求 build方法中先判断控制器是否为空,再检查初始化状态dispose时使用空安全操作符?.,确保只有控制器存在时才执行销毁- 优化异步初始化逻辑,使用
try-catch捕获异常,并用await替代then,代码更清晰
内容的提问来源于stack exchange,提问作者Lear
相关产品推荐
相关产品推荐

