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

Flutter FutureBuilder报错:camera已初始化问题求助

解决Flutter FutureBuilder相机初始化重复赋值错误

问题根源

你用late修饰了camera变量,这个类型的变量只能被初始化一次。而你把_getCamera()直接放在FutureBuilder的future参数里,当Widget因为权限授予、状态变化等原因重建时,build方法会重新执行,导致_getCamera()被再次调用,这时已经初始化过的camera变量被再次赋值,就触发了LateInitializationError。

解决办法

方案1:把Future初始化移到initState里

只在组件初始化时调用一次_getCamera(),避免重复执行:

late Future<void> _cameraInitFuture;
late CameraController camera;

@override
void initState() {
  super.initState();
  // 只在initState里初始化future,确保只执行一次
  _cameraInitFuture = _getCamera();
}

Future<void> _getCamera() async {
  final cameras = await availableCameras();
  camera = CameraController(cameras[0], ResolutionPreset.medium);
  await camera.initialize();
}

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    // 这里用提前初始化好的future变量,不是直接调用方法
    future: _cameraInitFuture,
    builder: (context, snapshot) {
      // 你的builder逻辑...
    },
  );
}

方案2:改用可空类型替代late

把camera改成可空的CameraController?,赋值前先判断是否为空:

CameraController? camera;

Future<void> _getCamera() async {
  if (camera != null) return; // 已经初始化过就直接返回
  final cameras = await availableCameras();
  camera = CameraController(cameras[0], ResolutionPreset.medium);
  await camera!.initialize();
}

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: _getCamera(),
    builder: (context, snapshot) {
      // 你的builder逻辑...
    },
  );
}

额外提醒

记得在组件销毁时释放相机资源,避免内存泄漏:

@override
void dispose() {
  camera?.dispose();
  super.dispose();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:12:34