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

Flutter QR Camera页面切换返回后失效,求状态管理解决方案

解决Flutter二维码扫描页面返回后相机失效问题

你的问题根源是页面导航离开时,QRViewController已被释放,但返回页面时没有重新创建有效实例,导致相机无法正常启动。以下是针对性的修复方案:

核心修复点

  • 确保页面销毁时彻底释放相机控制器并清空引用
  • 每次页面重建时重新绑定新的相机控制器实例
  • 优化生命周期方法中的空指针判断,避免无效操作

修改后的完整代码

@override
void initState() {
  super.initState();
  _animationController = AnimationController(vsync: this, duration: const Duration(seconds: 1));
  _animation = Tween<double>(begin: 0, end: 1).animate(CurvedAnimation(
    parent: _animationController,
    curve: Curves.easeInOutCirc
  ));
  _animationController.forward();
}

@override
void dispose() {
  _animationController.dispose();
  qrViewController?.stopCamera();
  qrViewController?.dispose();
  qrViewController = null; // 清空引用,避免后续使用失效实例
  super.dispose();
}

@override
Future<void> reassemble() async {
  super.reassemble();
  if (qrViewController != null) {
    if (Platform.isAndroid) {
      await qrViewController!.pauseCamera();
    }
    qrViewController!.resumeCamera();
  }
}

void onQrViewCreated(QRViewController controller) {
  // 先释放旧控制器,防止内存泄漏
  if (qrViewController != null) {
    qrViewController!.dispose();
  }
  setState(() {
    qrViewController = controller;
  });
  controller.scannedDataStream.listen((event) async {
    // 这里添加你的扫码处理逻辑
  });
}

关键说明

  1. dispose方法优化:除了释放控制器,还要将引用置空,确保返回页面时不会复用已失效的实例。同时别忘了释放动画控制器,避免内存泄漏。
  2. onQrViewCreated逻辑调整:每次创建新控制器前,先检查并释放旧控制器,保证每次页面重建都使用全新的相机实例。
  3. reassemble增加空判断:防止页面未完成初始化时调用相机方法,避免空指针异常。

内容的提问来源于stack exchange,提问作者B. Mercan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:35:13