Flutter二维码扫描插件flutter_qr_scan的使用
Flutter二维码扫描插件flutter_qr_scan的使用
QR码(扫描码/图片)识别,基于hetian9288/flutter_qr_reader的分叉版本。
我们添加了从QR码读取字节/原始数据的功能,因此onScan()
回调函数现在有两个参数:
Future onScan(String data, String rawData) async {
print(data);
print(rawData);
}
详细文档可以参见hetian9288/flutter_qr_reader。
完整示例代码
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_qr_scan/flutter_qr_scan.dart';
import 'package:flutter_qr_scan_example/scanViewDemo.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(home: HomePage());
}
}
class HomePage extends StatefulWidget {
HomePage({Key key}) : super(key: key);
[@override](/user/override)
_HomePageState createState() => new _HomePageState();
}
class _HomePageState extends State<HomePage> {
QrReaderViewController _controller;
bool isOk = false;
String data;
String rawData;
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: SingleChildScrollView(
child: Column(
children: <Widget>[
FlatButton(
onPressed: () async {
final status = await Permission.camera.request();
print(status);
if (status.isGranted) {
showDialog(
context: context,
builder: (context) {
return Dialog(
child: Text("ok"),
);
},
);
setState(() {
isOk = true;
});
}
},
child: Text("请求权限"),
color: Colors.blue,
),
FlatButton(
onPressed: () async {
Navigator.push(context,
MaterialPageRoute(builder: (context) => ScanViewDemo()));
},
child: Text("独立UI"),
),
FlatButton(
onPressed: () async {
var image = await ImagePicker().getImage(source: ImageSource.gallery);
if (image == null) return;
final rest = await FlutterQrReader.imgScan(File(image.path));
setState(() {
data = rest;
});
},
child: Text("识别图片")),
FlatButton(
onPressed: () {
assert(_controller != null);
_controller.setFlashlight();
},
child: Text("切换闪光灯")),
FlatButton(
onPressed: () {
assert(_controller != null);
_controller.startCamera(onScan);
},
child: Text("开始扫码(暂停后)")),
if (data != null) Text('$data\nrawData: $rawData'),
if (isOk)
Container(
width: 320,
height: 350,
child: QrReaderView(
width: 320,
height: 350,
callback: (container) {
this._controller = container;
_controller.startCamera(onScan);
},
),
)
],
),
),
);
}
void onScan(String v, List<Offset> offsets, String raw) {
print([v, offsets, raw]);
setState(() {
data = v;
rawData = raw;
});
_controller.stopCamera();
}
[@override](/user/override)
void dispose() {
// TODO: 实现dispose方法
super.dispose();
}
}
更多关于Flutter二维码扫描插件flutter_qr_scan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter二维码扫描插件flutter_qr_scan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_qr_scan
插件进行二维码扫描的详细代码示例。这个插件允许你通过设备的摄像头扫描二维码,并获取其内容。
1. 添加依赖
首先,你需要在你的pubspec.yaml
文件中添加flutter_qr_scan
的依赖:
dependencies:
flutter:
sdk: flutter
flutter_qr_scan: ^3.0.1 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置权限
由于二维码扫描需要使用设备的摄像头,你需要在AndroidManifest.xml
(针对Android)和Info.plist
(针对iOS)中添加相应的权限配置。
Android
在android/app/src/main/AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
iOS
在ios/Runner/Info.plist
中添加:
<key>NSCameraUsageDescription</key>
<string>需要访问相机以扫描二维码</string>
3. 使用插件
在你的Flutter项目中,你可以创建一个新的页面或使用现有页面来启动二维码扫描功能。以下是一个完整的示例:
导入包
在你的Dart文件中导入flutter_qr_scan
包:
import 'package:flutter/material.dart';
import 'package:flutter_qr_scan/flutter_qr_scan.dart';
创建扫描页面
创建一个新的页面或修改现有页面,使用QRScanner
小部件来启动扫描:
class QRCodeScannerPage extends StatefulWidget {
@override
_QRCodeScannerPageState createState() => _QRCodeScannerPageState();
}
class _QRCodeScannerPageState extends State<QRCodeScannerPage> {
String qrResult = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("二维码扫描"),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 5,
child: QRView.builder(
buildPreview: (BuildContext context) {
return RCustomPaint(
size: Size.square(300.0),
painter: QRPainter(data: qrResult),
);
},
onScanResult: (result) {
setState(() {
qrResult = result;
});
// 你可以在这里处理扫描结果,例如导航到另一个页面
// Navigator.pushNamed(context, '/result', arguments: result);
},
),
),
Expanded(
flex: 1,
child: Center(
child: Text(
"扫描结果: $qrResult",
style: TextStyle(fontSize: 20),
),
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 这里可以添加自定义按钮功能,例如重置扫描结果
setState(() {
qrResult = "";
});
},
tooltip: '重置',
child: Icon(Icons.clear),
),
);
}
}
注意:RCustomPaint
和QRPainter
是为了在预览中显示扫描结果,这些类需要你自己实现或者你可以直接使用默认的扫描界面。
4. 导航到扫描页面
在你的主页面或者其他页面中,添加导航到二维码扫描页面的功能:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => QRCodeScannerPage()),
);
这样,你就可以在你的Flutter应用中实现二维码扫描功能了。确保你已经正确配置了权限,并且插件的版本与你的Flutter环境兼容。