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

Flutter相机应用遇LateInitializationError问题求助

解决Flutter相机页面LateInitializationError问题

问题根源

你遇到的LateInitializationError是因为_initializeController这个late修饰的变量,在页面build执行时还没完成赋值。startCamera是异步函数,initState中调用它后,build会优先执行,此时_initializeController仍未初始化,触发错误。热重载后正常是因为热重载保留了部分状态,相机控制器已完成初始化,变量被正确赋值。

修复步骤

1. 调整startCamera函数返回值

让函数返回Future<void>,直接将异步流程绑定到_initializeController:

Future<void> startCamera() async {
  cameras = await availableCameras();
  _controller = CameraController(cameras[1], ResolutionPreset.high,
      enableAudio: false, imageFormatGroup: ImageFormatGroup.jpeg);
  await _controller.initialize();
}

2. 修正initState中变量赋值逻辑

在initState里直接把异步函数赋值给_initializeController,确保build执行时变量已被初始化:

@override
void initState() {
  super.initState();
  _initializeController = startCamera();
}

3. 优化dispose逻辑(可选)

避免在控制器未初始化时调用dispose,增加安全判断:

@override
void dispose() {
  if (_controller.value.isInitialized) {
    _controller.dispose();
  }
  super.dispose();
}

完整修复后的scan.dart代码

class ScanPage extends StatefulWidget {
  const ScanPage({super.key, required this.title});

  final String title;

  @override
  State<ScanPage> createState() => _ScanPageState();
}

class _ScanPageState extends State<ScanPage> {
  late List<CameraDescription> cameras;
  late CameraController _controller;
  late Future<void> _initializeController;

  Future<void> startCamera() async {
    cameras = await availableCameras();
    _controller = CameraController(cameras[1], ResolutionPreset.high,
        enableAudio: false, imageFormatGroup: ImageFormatGroup.jpeg);
    await _controller.initialize();
  }

  @override
  void initState() {
    super.initState();
    _initializeController = startCamera();
  }

  @override
  void dispose() {
    if (_controller.value.isInitialized) {
      _controller.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        extendBody: true,
        resizeToAvoidBottomInset: true,
        floatingActionButtonLocation: 
        FloatingActionButtonLocation.centerFloat,
        body: Stack(
          alignment: AlignmentDirectional.bottomEnd,
          children: [
            FutureBuilder<void>(
              future: _initializeController,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  return CameraPreview(_controller);
                } else {
                  return const Center(child: CircularProgressIndicator());
                }
              },
            ),
          ],
        ));
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:37:08