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

Flutter iOS模拟器中CameraPreview触发LateInitializationError问题求助

相机预览触发LateInitializationError的原因及解决

核心原因

  • 异步初始化赶不上build执行:availableCameras()是异步方法,initState里的异步回调还没跑完,build就已经执行了,这时候_cameraController还没被赋值,直接传给CameraPreview就触发了未初始化错误。
  • 初始化方法里的错误操作:第一次调用_initCameraController时,第一行就是await _cameraController.dispose(),但这时候_cameraController还没被初始化,这一步本身就会报错,导致后续的控制器初始化流程中断。
  • iOS模拟器的硬件限制:iOS模拟器没有真实的相机硬件,availableCameras()大概率会返回空列表,这时候cameras[0]会触发索引越界,直接导致控制器根本没机会被初始化。

修复方案

  1. 处理空相机列表的情况:获取相机列表后先判断是否为空,避免索引越界,同时给用户提示。
  2. 修正初始化方法逻辑:只有当控制器已经被初始化过的时候,才执行销毁操作,避免调用未初始化的对象。
  3. build时判断控制器状态:在build方法里先检查_cameraController是否初始化完成,未准备好时显示加载提示或占位组件。

修正后的代码示例

List<CameraDescription>? cameras; // 改为可空类型,避免提前用late初始化

class AddPostPage extends StatefulWidget {
  const AddPostPage({super.key});

  @override
  _AddPostPageState createState() => _AddPostPageState();
}

class _AddPostPageState extends State<AddPostPage> {
  CameraController? _cameraController; // 改为可空类型,无需late

  @override
  void initState() {
    _loadCameras();
    super.initState();
  }

  Future<void> _loadCameras() async {
    try {
      cameras = await availableCameras();
      if (cameras?.isNotEmpty == true) {
        await _initCameraController(cameras![0]);
      } else {
        if (mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(content: Text("没有可用的相机设备")),
          );
        }
      }
    } catch (e) {
      print("获取相机列表失败: $e");
    }
  }

  Future<void> _initCameraController(CameraDescription cameraDescription) async {
    // 先判断控制器是否存在,再执行销毁
    if (_cameraController != null) {
      await _cameraController!.dispose();
    }
    _cameraController = CameraController(
      cameraDescription,
      ResolutionPreset.high,
    );

    _cameraController!.addListener(() {
      if (mounted) setState(() {});
    });

    try {
      await _cameraController!.initialize();
    } on Exception catch (exception) {
      print("相机初始化失败: $exception");
    }

    if (mounted) setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return ResponsiveBuilder(
      builder: (BuildContext context, SizingInformation sizingInformation) {
        return Scaffold(
          body: Stack(
            children: [
              // 控制器初始化完成后再渲染预览
              if (_cameraController != null && _cameraController!.value.isInitialized)
                Container(
                  height: double.infinity,
                  child: CameraPreview(_cameraController!),
                )
              else
                // 未初始化时显示加载状态
                const Center(child: CircularProgressIndicator()),
            ],
          ),
        );
      },
    );
  }

  @override
  void dispose() {
    _cameraController?.dispose(); // 用可选链避免空指针异常
    super.dispose();
  }
}

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:25:15