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

Flutter Camera:按Home键将App退至后台持续抛出异常

解决Flutter Camera插件后台抛出Handler死线程异常问题

问题分析

你遇到的是camera: ^0.9.2+2版本的已知bug:应用退到后台后,相机资源未被正确释放,相机回调仍尝试向已销毁的线程发送消息,导致持续抛出Handler sending message to a dead thread异常;返回前台后预览冻结,常规的pausePreview()/resumePreview()无法解决核心问题。

解决方案

1. 优先升级Camera插件版本

旧版本camera插件存在后台资源泄漏问题,后续稳定版本已修复该bug。直接升级到最新稳定版(例如camera: ^0.10.0+1及以上)即可解决大部分此类问题。

修改pubspec.yaml中的依赖:

dependencies:
  camera: ^0.10.0+1 # 替换为最新稳定版

执行flutter pub get更新依赖后重新运行项目。

2. 手动管理相机生命周期(适用于无法升级插件的场景)

通过监听应用生命周期,在后台时彻底释放相机资源,前台恢复时重新初始化相机:

在页面的State类中混入WidgetsBindingObserver,实现状态监听逻辑:

class CameraPageState extends State<CameraPage> with WidgetsBindingObserver {
  CameraController? _controller;
  List<CameraDescription>? _cameras;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _initCamera();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _controller?.dispose();
    super.dispose();
  }

  // 监听应用生命周期变化
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (_controller == null || !_controller!.value.isInitialized) {
      return;
    }
    switch (state) {
      case AppLifecycleState.paused:
        // 退到后台时彻底释放相机资源
        _controller?.dispose();
        _controller = null;
        break;
      case AppLifecycleState.resumed:
        // 返回前台时重新初始化相机
        if (_controller == null) {
          _initCamera();
        }
        break;
      default:
        break;
    }
  }

  // 相机初始化方法
  Future<void> _initCamera() async {
    _cameras = await availableCameras();
    if (_cameras != null && _cameras!.isNotEmpty) {
      _controller = CameraController(
        _cameras![0],
        ResolutionPreset.medium,
      );
      await _controller!.initialize();
      if (mounted) {
        setState(() {});
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    if (_controller == null || !_controller!.value.isInitialized) {
      return const Center(child: Text('相机初始化中...'));
    }
    return CameraPreview(_controller!);
  }
}

3. 额外注意事项

  • 升级插件后若仍有异常,检查相机权限是否在前台恢复时重新获取(部分Android机型会在后台回收硬件权限)。
  • 避免在后台保留相机资源,Android系统对后台应用的硬件访问有严格限制,强行保留会触发系统回收,引发异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:11:15