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
相关产品推荐
相关产品推荐

