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

Flutter使用qr_code_scanner扫码后如何处理接口返回的成功失败状态

代码修改方案

1. 修正ScanApi类的scan方法

你当前的scan方法没有定义入参,无法接收扫码得到的字符串,且POST请求没有传参,修改后代码如下:

static Future<String> scan(String? qrCode) async {
  // 替换为你的实际接口地址
  final url = Uri.parse("你的接口URL");
  // 按接口要求传参,这里假设参数名为qr_code,可按需修改
  final response = await http.post(
    url,
    body: {"qr_code": qrCode ?? ""},
  );

  if (response.statusCode == 200) {
    final resData = json.decode(response.body);
    // 假设接口返回status字段为success代表业务成功,fail代表业务失败,可按你实际接口字段修改
    return resData["status"] ?? "fail";
  } else {
    throw Exception("请求失败,状态码:${response.statusCode}");
  }
}

2. 改造_onQRViewCreated回调逻辑

添加try-catch捕获接口请求异常,同时根据接口返回的状态区分展示成功/失败弹窗:

void _onQRViewCreated(QRViewController controller) {
  this.controller = controller;
  controller.scannedDataStream.listen((scanData) async {
    controller.pauseCamera();
    String dialogTitle;
    String dialogContent;
    try {
      // 调用扫码接口
      String status = await ScanApi.scan(scanData.code);
      if (status == "success") {
        // 业务成功逻辑
        dialogTitle = "扫码成功";
        dialogContent = "二维码内容:${scanData.code}\n校验通过";
      } else {
        // 业务失败逻辑
        dialogTitle = "扫码失败";
        dialogContent = "二维码内容:${scanData.code}\n校验不通过,请重试";
      }
    } catch (e) {
      // 接口请求异常逻辑
      dialogTitle = "请求异常";
      dialogContent = "扫码校验失败:${e.toString()}";
    } finally {
      // 无论成功失败都弹出提示
      if (mounted) {
        showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text(dialogTitle),
              content: SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[
                    Text(dialogContent),
                  ],
                ),
              ),
              actions: <Widget>[
                TextButton(
                  child: const Text('确定'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            );
          },
        ).then((value) => controller.resumeCamera());
      }
    }
  });
}

核心说明

  • 用try-catch包裹异步接口请求,捕获网络异常、接口报错等非预期错误
  • 对接口返回的status字段做分支判断,分别处理业务成功、业务失败的场景
  • 增加mounted判断,避免页面销毁后弹窗导致的内存泄漏问题
  • 弹窗关闭后统一恢复相机扫码,不影响下一次扫码操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:39:01