Flutter扫码器未扫码退出时触发Class 'int'无[]方法运行时错误
解决Flutter扫码取消时的运行时错误
错误原因
当用户未扫码就点击Stop按钮或按下返回键时,flutter_barcode_scanner的scanBarcode()方法会返回字符串"-1"。你的代码直接对这个字符串执行jsonDecode(),得到的是int类型的-1,之后尝试调用info["regNo"](对int类型使用字典访问符),就会触发Class 'int' has no instance method '[]'的错误。
解决方案
需要在代码中增加两个关键判断:
- 先检查返回结果是否为取消标识
"-1",如果是则直接结束流程 - 对JSON解析过程增加异常捕获,避免扫码到非JSON内容时崩溃
修改后的完整代码:
class homePage extends StatelessWidget { const homePage({super.key}); Future scanQRCode(BuildContext context) async { var res = await FlutterBarcodeScanner.scanBarcode( '#ff6666', "Stop", true, ScanMode.QR); // 判断是否为取消扫码的情况 if (res == "-1") { return; // 直接终止,不执行后续逻辑 } try { // 捕获JSON解析异常 var info = jsonDecode(res); // 额外判断info是否为Map类型,确保可以通过key访问 if (info is Map) { Navigator.push( context, MaterialPageRoute( builder: (context) => Details( regNo: info["regNo"].toString(), event: info["slug"].toString(), ), ), ); } else { // 处理非Map类型的JSON(不符合预期的情况) ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("扫码内容格式不正确")), ); } } catch (e) { // 解析失败时提示用户 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("无法解析扫码内容")), ); } } @override Widget build(BuildContext context) { var vertical = MediaQuery.of(context).size.height; return Center( child: ElevatedButton( onPressed: () { scanQRCode(context); }, style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent[700]), child: Text( "Scan", style: TextStyle(fontSize: vertical * 0.03), ), ), ); } }
关键说明
- 取消扫码判断:直接对比返回值是否为
"-1",这是flutter_barcode_scanner约定的取消标识 - 异常捕获:用
try-catch包裹jsonDecode,避免非法JSON导致崩溃 - 类型检查:增加
info is Map判断,确保后续可以安全使用key访问属性,同时给用户友好的错误提示
内容的提问来源于stack exchange,提问作者D4RTHW1MP
相关产品推荐
相关产品推荐

