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

Flutter使用flutter_barcode_scanner扫码后如何将数据传递到新页面

Flutter 扫码结果传递到新页面实现方案

你只需在获取到扫描结果后,调用路由跳转时携带参数即可实现需求,以下是两种常用实现方案,可根据你的路由使用习惯二选一:


方案1:直接使用MaterialPageRoute跳转传值

步骤1:修改扫码函数,拿到有效结果后直接跳转

Future<void> scanBarcodeNormal() async {
  String barcodeScanRes;
  try {
    barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
        '#ff6666', 'Cancel', true, ScanMode.BARCODE);
    print(barcodeScanRes);
  } on PlatformException {
    barcodeScanRes = 'Failed to get platform version.';
  }
  if (!mounted) return;
  
  // 过滤用户点击取消的无效结果(插件取消扫码默认返回字符串-1)
  if(barcodeScanRes != "-1"){
    // 跳转时直接把扫描结果传入目标页面构造函数
    Navigator.push(
      context, 
      MaterialPageRoute(builder: (context)=> BarcodeResultPage(barcode: barcodeScanRes))
    );
  }

  setState(() {
    _scanBarcode = barcodeScanRes;
  });
}

步骤2:编写目标页面接收参数

// 扫码结果页代码示例
class BarcodeResultPage extends StatelessWidget {
  // 定义变量接收传递过来的条码数据
  final String barcode;
  const BarcodeResultPage({Key? key, required this.barcode}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("扫码结果")),
      body: Center(child: Text("扫描得到的条码:$barcode")),
    );
  }
}

方案2:使用命名路由传值(适配你现有代码中pushNamed的路由写法)

步骤1:修改扫码函数,跳转时携带arguments参数

Future<void> scanBarcodeNormal() async {
  String barcodeScanRes;
  try {
    barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
        '#ff6666', 'Cancel', true, ScanMode.BARCODE);
    print(barcodeScanRes);
  } on PlatformException {
    barcodeScanRes = 'Failed to get platform version.';
  }
  if (!mounted) return;
  
  if(barcodeScanRes != "-1"){
    // 命名路由跳转时通过arguments携带参数
    Navigator.pushNamed(context, '/barcodeResult', arguments: barcodeScanRes);
  }

  setState(() {
    _scanBarcode = barcodeScanRes;
  });
}

步骤2:注册路由并在目标页接收参数

首先在你的MaterialApp配置中注册对应路由:

MaterialApp(
  // 你的其他配置
  routes: {
    // 你的其他已注册路由
    '/barcodeResult': (context) => const BarcodeResultPage(),
  },
)

目标页参数接收代码:

class BarcodeResultPage extends StatelessWidget {
  const BarcodeResultPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // 从路由设置中取出传递的条码参数
    final String? barcode = ModalRoute.of(context)?.settings.arguments as String?;
    return Scaffold(
      appBar: AppBar(title: const Text("扫码结果")),
      body: Center(child: Text("扫描得到的条码:${barcode ?? "无有效数据"}")),
    );
  }
}

补充说明

如果需要在多个页面共享扫描结果,可以选用Provider、GetX等状态管理方案存储数据,以上两种方案为单页面传递场景的最简实现。

内容的提问来源于stack exchange,提问作者Jian Yuan Ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:27:00