二维码通常包含两部分:扫描与展示。下面分别用 qr_code_scanner 与 pretty_qr_code 给出完整范式。
0. 依赖
dependencies:
qr_code_scanner: ^1.0.1
pretty_qr_code: ^3.0.0
1. 扫码组件
class QRScanPage extends StatefulWidget {
const QRScanPage({super.key});
@override
State<QRScanPage> createState() => _QRScanPageState();
}
class _QRScanPageState extends State<QRScanPage> {
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
QRViewController? controller;
@override
void dispose() {
controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: QRView(
key: qrKey,
onQRViewCreated: (c) {
controller = c;
controller!.scannedDataStream.listen((scanData) {
// 处理结果
+ controller?.pauseCamera();
+ Navigator.pop(context, scanData.code);
});
},
),
);
}
}
2. 展示二维码
PrettyQrView.data(
data: 'https://example.com',
decoration: const PrettyQrDecoration(
shape: PrettyQrSmoothSymbol(color: Colors.black),
),
)
3. 常见坑点
- 未释放控制器:必须 dispose
- 相机权限未配置:iOS/Android 会崩溃
- 扫码多次触发:记得暂停相机
4. 实践清单
- 扫码后暂停相机
- 关闭页面前释放控制器
- 统一结果处理