Flutter中不使用Firebase ML Kit从本地图片读取二维码如何实现
Flutter 本地图片二维码识别实现方案(无需Firebase ML Kit)
1. 新增依赖
在pubspec.yaml的dependencies下添加二维码识别库,这里推荐使用flutter_zxing,纯端侧实现无需接入任何云服务或Firebase套件:
dependencies: flutter: sdk: flutter image_picker: ^0.8.4+1 # 你已有的依赖 flutter_zxing: ^1.5.0 # 新增二维码识别依赖
添加完成后执行flutter pub get安装依赖。
2. 基础配置调整
安卓端需要将android/app/build.gradle中的minSdkVersion调整为19及以上:
android { defaultConfig { minSdkVersion 19 // 修改为19或更高版本 } }
iOS端无需额外特殊配置。
3. 新增二维码识别逻辑
新增独立的图片二维码解析方法,直接传入图片文件即可返回识别结果:
import 'package:flutter_zxing/flutter_zxing.dart'; // 从图片文件识别二维码,识别成功返回内容,识别失败返回null Future<String?> parseQrFromFile(File imageFile) async { final result = await FlutterZxing().readBarcodeImagePath( path: imageFile.path, ); return result?.text; }
4. 整合到现有代码
你可以选择选中图片后自动识别,也可以新增按钮手动触发识别,以下是修改后的完整示例代码:
File? _image; String? qrResult; // 存储识别到的二维码内容 @override Widget build(BuildContext context) { return Container( child: Column( children: [ ElevatedButton.icon( style: ElevatedButton.styleFrom( primary: Theme.of(context).buttonColor ), onPressed: () async => pickImage(), icon: Icon(Icons.image), label: Text("从相册选择图片"), ), // 展示选中的图片 if (_image != null) Image.file(_image!, height: 200), // 展示识别结果 if (qrResult != null) Text("识别结果:$qrResult"), ], ), ); } Future<void> pickImage() async { await Permission.storage.request(); var status = await Permission.storage.status; if (status.isGranted) { final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery); if (pickedFile != null) { final imageFile = File(pickedFile.path); // 识别图片中的二维码 final result = await parseQrFromFile(imageFile); setState( () { _image = imageFile; qrResult = result ?? "未识别到有效二维码"; }, ); } } } Future<String?> parseQrFromFile(File imageFile) async { final result = await FlutterZxing().readBarcodeImagePath( path: imageFile.path, ); return result?.text; }
注意事项
- 仅支持识别内容清晰、完整的二维码图片,模糊、裁切不全的图片会导致识别失败
- 如需识别其他格式的条码,可通过调整
flutter_zxing的识别格式参数实现
内容的提问来源于stack exchange,提问作者Code With Bishal
相关产品推荐
相关产品推荐

