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

Flutter:如何从qr_code_scanner返回数据至前页并保留上下文

问题解决方案

你的核心问题是错误地使用了Navigator.pushNamed返回MainPage,这会创建新的MainPage实例,导致原有控制器数据丢失,同时导航栈结构混乱,最终pop时回到错误页面。以下是具体修改方案:

1. 修改MainPage的扫描按钮逻辑

使用await Navigator.pushNamed接收QRScanner返回的结果,直接更新原有控制器,无需重新创建MainPage:

ElevatedButton(
  onPressed: () async {
    // 等待QRScanner页面返回结果
    final scanResult = await Navigator.pushNamed(context, "/qrScanner");
    // 结果不为空时更新输入框
    if (scanResult != null && scanResult is String) {
      _qrText.text = scanResult;
    }
  },
  child: Text('Scan'),
),

2. 删除MainPage中不必要的传值逻辑

去掉initState中通过路由参数接收数据的代码,因为现在直接通过返回值获取结果:

// 删掉这些冗余代码:
late QRScan? args;

@override
initState() {
  super.initState();

  final widgetsBinding = WidgetsBinding.instance;
  widgetsBinding.addPostFrameCallback((callback) async {
    if (ModalRoute.of(context)?.settings.arguments != null) {
      args = ModalRoute.of(context)!.settings.arguments as QRScan?;
      _qrText.text = args!.result!;
    }
  });
}

// 保留简洁的初始化逻辑:
@override
initState() {
  super.initState();
}

3. 修改QRScanner页面的返回逻辑

用Navigator.pop直接返回扫描结果,而不是重新push MainPage:

passToPreviousPage() {
  controller?.pauseCamera();
  // 将扫描结果传回上一页(MainPage),并关闭当前页面
  Navigator.pop(context, result!.code);
}

同时优化扫描流的处理,避免重复触发返回:

void _onQRViewCreated(QRViewController controller) {
  setState(() {
    this.controller = controller;
  });
  controller.scannedDataStream.listen((scanData) {
    // 避免重复处理同一扫描结果
    if (result != null) return;
    setState(() {
      result = scanData;
      controller.pauseCamera();
      passToPreviousPage();
    });
  });
}

4. 清理冗余代码

删除不再需要的QRScan类,因为现在直接返回字符串结果即可。

为什么这样修改能解决问题?

  • 导航栈结构变为:Dashboard -> MainPage -> QRScanner,QRScanner是被push到MainPage之上的临时页面,关闭后回到原MainPage实例,不会重置控制器数据。
  • MainPage的Navigator.pop(context)会直接回到Dashboard,因为此时栈中MainPage的上一级就是Dashboard。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:14:59