Flutter相机初始化报错:LateInitializationError问题求助
解决LateInitializationError: Field 'imgCamera' has not been initialized问题
问题原因
你用late修饰了imgCamera,但这个变量的初始化是在相机流的回调逻辑里,而build方法中直接通过imgCamera == null判断状态——late修饰的变量在未初始化时访问会直接抛出LateInitializationError,而且CameraImage本身是非空类型,不能和null做比较。
修复步骤
- 修改imgCamera的类型
把late CameraImage imgCamera改为可空类型,让变量默认值为null,这样就能安全做空判断:
CameraImage? imgCamera;
- 完善相机控制器的状态判断
在显示CameraPreview前,先检查相机控制器是否完成初始化,避免额外报错:
child: imgCamera == null ? const SizedBox( height: 270, width: 360, child: Icon(Icons.photo_camera_front, color: Colors.blueAccent, size: 40,), ) : cameraController.value.isInitialized ? AspectRatio( aspectRatio: cameraController.value.aspectRatio, child: CameraPreview(cameraController), ) : const CircularProgressIndicator(),
- 添加资源释放逻辑
在页面销毁时释放相机控制器,防止内存泄漏:
@override void dispose() { cameraController.dispose(); super.dispose(); }
修改后的完整HomePage代码
import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'main.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { bool isWorking = false; String result = ""; late CameraController cameraController; CameraImage? imgCamera; // 改为可空类型 final ButtonStyle flatButtonStyle = TextButton.styleFrom( primary: Colors.white, minimumSize: const Size(88, 44), padding: const EdgeInsets.symmetric(horizontal: 16.0), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(2.0)), ), backgroundColor: Colors.blue, ); void initCamera() { cameraController = CameraController(cameras[0], ResolutionPreset.medium); cameraController.initialize().then((value) { if (!mounted) { return; } setState(() { cameraController.startImageStream((imageFromStream) { if (!isWorking) { isWorking = true; imgCamera = imageFromStream; } }); }); }); } @override void dispose() { cameraController.dispose(); // 释放相机资源 super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: SafeArea( child: Scaffold( body: Container( decoration: const BoxDecoration( image: DecorationImage( image: AssetImage("assets/images/ia2.jpeg") ), ), child: Column( children: [ Center( child: Container( height: 320, width: 330, child: Image.asset("assets/images/ia.jpeg"), ), ), Center( child: TextButton( style: flatButtonStyle, onPressed: () { initCamera(); }, child: imgCamera == null ? const SizedBox( height: 270, width: 360, child: Icon(Icons.photo_camera_front, color: Colors.blueAccent, size: 40,), ) : cameraController.value.isInitialized ? AspectRatio( aspectRatio: cameraController.value.aspectRatio, child: CameraPreview(cameraController), ) : const CircularProgressIndicator(), ), ), ], ), ), ), ), ); } }
内容的提问来源于stack exchange,提问作者fred ngame
相关产品推荐
相关产品推荐

