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

Flutter相机初始化报错:LateInitializationError问题求助

解决LateInitializationError: Field 'imgCamera' has not been initialized问题

问题原因

你用late修饰了imgCamera,但这个变量的初始化是在相机流的回调逻辑里,而build方法中直接通过imgCamera == null判断状态——late修饰的变量在未初始化时访问会直接抛出LateInitializationError,而且CameraImage本身是非空类型,不能和null做比较。

修复步骤

  1. 修改imgCamera的类型
    把late CameraImage imgCamera改为可空类型,让变量默认值为null,这样就能安全做空判断:
CameraImage? imgCamera;
  1. 完善相机控制器的状态判断
    在显示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(),
  1. 添加资源释放逻辑
    在页面销毁时释放相机控制器,防止内存泄漏:
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:13