Flutter二维码扫描插件qrscan2的使用
Flutter二维码扫描插件qrscan2的使用
权限
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
安装
将以下依赖添加到你的pubspec.yaml
文件中:
dependencies:
qrscan: ^0.3.2
使用示例
扫描二维码或条形码
import 'package:qrscan/qrscan.dart' as scanner;
String cameraScanResult = await scanner.scan();
从相册中选择照片进行分析
import 'package:qrscan/qrscan.dart' as scanner;
String photoScanResult = await scanner.scanPhoto();
扫描指定路径的图像
import 'package:qrscan/qrscan.dart' as scanner;
String barcode = await scanner.scanPath(path);
解析Uint8List为字符串
import 'package:qrscan/qrscan.dart' as scanner;
File file = await ImagePicker.pickImage(source: ImageSource.camera);
Uint8List bytes = file.readAsBytesSync();
String barcode = await scanner.scanBytes(uint8list);
功能支持
- ✅ 扫描BR-CODE
- ✅ 扫描QR-CODE
- ✅ 在扫描时控制闪光灯
- ✅ 申请相机权限
- ✅ 在相册中扫描BR-CODE或QR-CODE
- ✅ 使用uint8list解析为代码字符串
- ✅ 扫描指定路径的图像
- ✅ 根据光照强度显示手电筒开关按钮
- ✅ 生成QR-CODE
- ✅ 生成BR-CODE
待办事项
- [] 支持iOS(示例可以构建,但调用扫描器不会返回)
- [] 如果必要,提供iOS设置文档
示例应用
示例代码
以下是完整的示例代码:
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:qrscan/qrscan2.dart' as scanner;
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Uint8List bytes = Uint8List(0);
TextEditingController _inputController;
TextEditingController _outputController;
[@override](/user/override)
initState() {
super.initState();
this._inputController = new TextEditingController();
this._outputController = new TextEditingController();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.grey[300],
body: Builder(
builder: (BuildContext context) {
return ListView(
children: <Widget>[
_qrCodeWidget(this.bytes, context),
Container(
color: Colors.white,
child: Column(
children: <Widget>[
TextField(
controller: this._inputController,
keyboardType: TextInputType.url,
textInputAction: TextInputAction.go,
onSubmitted: (value) => _generateBarCode(value),
decoration: InputDecoration(
prefixIcon: Icon(Icons.text_fields),
helperText:
'请输入您的代码以生成二维码图像。',
hintText: '请输入您的代码',
hintStyle: TextStyle(fontSize: 15),
contentPadding:
EdgeInsets.symmetric(horizontal: 7, vertical: 15),
),
),
SizedBox(height: 20),
TextField(
controller: this._outputController,
maxLines: 2,
decoration: InputDecoration(
prefixIcon: Icon(Icons.wrap_text),
helperText:
'在此区域显示扫描的条形码或二维码。',
hintText:
'在此区域显示扫描的条形码或二维码。',
hintStyle: TextStyle(fontSize: 15),
contentPadding:
EdgeInsets.symmetric(horizontal: 7, vertical: 15),
),
),
SizedBox(height: 20),
this._buttonGroup(),
SizedBox(height: 70),
],
),
),
],
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () => _scanBytes(),
tooltip: '拍摄照片',
child: const Icon(Icons.camera_alt),
),
),
);
}
Widget _qrCodeWidget(Uint8List bytes, BuildContext context) {
return Padding(
padding: EdgeInsets.all(20),
child: Card(
elevation: 6,
child: Column(
children: <Widget>[
Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Icon(Icons.verified_user, size: 18, color: Colors.green),
Text(' 生成二维码', style: TextStyle(fontSize: 15)),
Spacer(),
Icon(Icons.more_vert, size: 18, color: Colors.black54),
],
),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 9),
decoration: BoxDecoration(
color: Colors.black12,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(4), topRight: Radius.circular(4)),
),
),
Padding(
padding:
EdgeInsets.only(left: 40, right: 40, top: 30, bottom: 10),
child: Column(
children: <Widget>[
SizedBox(
height: 190,
child: bytes.isEmpty
? Center(
child: Text('空代码 ... ',
style: TextStyle(color: Colors.black38)),
)
: Image.memory(bytes),
),
Padding(
padding: EdgeInsets.only(top: 7, left: 25, right: 25),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Expanded(
flex: 5,
child: GestureDetector(
child: Text(
'删除',
style:
TextStyle(fontSize: 15, color: Colors.blue),
textAlign: TextAlign.left,
),
onTap: () =>
this.setState(() => this.bytes = Uint8List(0)),
),
),
Text('|',
style:
TextStyle(fontSize: 15, color: Colors.black26)),
Expanded(
flex: 5,
child: GestureDetector(
onTap: () async {
final success =
await ImageGallerySaver.saveImage(this.bytes);
SnackBar snackBar;
if (success) {
snackBar = new SnackBar(
content:
new Text('保存成功!'));
Scaffold.of(context).showSnackBar(snackBar);
} else {
snackBar = new SnackBar(
content: new Text('保存失败!'));
}
},
child: Text(
'保存',
style:
TextStyle(fontSize: 15, color: Colors.blue),
textAlign: TextAlign.right,
),
),
),
],
),
)
],
),
),
Divider(height: 2, color: Colors.black26),
Container(
child: Row(
children: <Widget>[
Icon(Icons.history, size: 16, color: Colors.black38),
Text(' 生成历史',
style: TextStyle(fontSize: 14, color: Colors.black38)),
Spacer(),
Icon(Icons.chevron_right, size: 16, color: Colors.black38),
],
),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 9),
)
],
),
),
);
}
Widget _buttonGroup() {
return Row(
children: <Widget>[
Expanded(
flex: 1,
child: SizedBox(
height: 120,
child: InkWell(
onTap: () => _generateBarCode(this._inputController.text),
child: Card(
child: Column(
children: <Widget>[
Expanded(
flex: 2,
child: Image.asset('images/generate_qrcode.png'),
),
Divider(height: 20),
Expanded(flex: 1, child: Text("生成")),
],
),
),
),
),
),
Expanded(
flex: 1,
child: SizedBox(
height: 120,
child: InkWell(
onTap: _scan,
child: Card(
child: Column(
children: <Widget>[
Expanded(
flex: 2,
child: Image.asset('images/scanner.png'),
),
Divider(height: 20),
Expanded(flex: 1, child: Text("扫描")),
],
),
),
),
),
),
Expanded(
flex: 1,
child: SizedBox(
height: 120,
child: InkWell(
onTap: _scanPhoto,
child: Card(
child: Column(
children: <Widget>[
Expanded(
flex: 2,
child: Image.asset('images/albums.png'),
),
Divider(height: 20),
Expanded(flex: 1, child: Text("扫描照片")),
],
),
),
),
),
),
],
);
}
Future _scan() async {
await Permission.camera.request();
String barcode = await scanner.scan();
if (barcode == null) {
print('未返回任何结果。');
} else {
this._outputController.text = barcode;
}
}
Future _scanPhoto() async {
await Permission.storage.request();
String barcode = await scanner.scanPhoto();
this._outputController.text = barcode;
}
Future _scanPath(String path) async {
await Permission.storage.request();
String barcode = await scanner.scanPath(path);
this._outputController.text = barcode;
}
Future _scanBytes() async {
File file =
await ImagePicker().getImage(source: ImageSource.camera).then((picked) {
if (picked == null) return null;
return File(picked.path);
});
if (file == null) return;
Uint8List bytes = file.readAsBytesSync();
String barcode = await scanner.scanBytes(bytes);
this._outputController.text = barcode;
}
Future _generateBarCode(String inputCode) async {
Uint8List result = await scanner.generateBarCode(inputCode);
this.setState(() => this.bytes = result);
}
}
更多关于Flutter二维码扫描插件qrscan2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter二维码扫描插件qrscan2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用qrscan2
插件进行二维码扫描的示例代码。这个示例将展示如何集成该插件并处理扫描结果。
首先,确保你已经在pubspec.yaml
文件中添加了qrscan2
依赖:
dependencies:
flutter:
sdk: flutter
qrscan2: ^0.x.x # 请使用最新版本号替换这里的 '0.x.x'
然后,运行flutter pub get
来获取依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用qrscan2
插件:
- 导入必要的包:
在你的Dart文件中(例如main.dart
),导入qrscan2
包:
import 'package:flutter/material.dart';
import 'package:qrscan2/qrscan2.dart' as qrscan2;
- 创建一个扫描页面:
这里是一个简单的示例,展示如何启动二维码扫描并处理扫描结果:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ScanPage(),
);
}
}
class ScanPage extends StatefulWidget {
@override
_ScanPageState createState() => _ScanPageState();
}
class _ScanPageState extends State<ScanPage> {
String _result = "No result";
Future<void> _scanQRCode() async {
String result = await qrscan2.scan();
setState(() {
_result = result;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('QR Code Scanner'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Scan Result:',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
_result,
style: TextStyle(fontSize: 24, color: Colors.blue),
),
SizedBox(height: 40),
ElevatedButton(
onPressed: _scanQRCode,
child: Text('Scan QR Code'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,用于启动二维码扫描。扫描结果将显示在按钮下方的文本区域中。
- 处理权限请求:
请注意,在某些平台上(特别是Android),你可能需要在AndroidManifest.xml
文件中添加必要的权限,以便应用能够访问摄像头。对于qrscan2
插件,这通常会自动处理,但如果你遇到权限问题,请确保你的应用已正确请求并获得了必要的权限。
例如,在AndroidManifest.xml
中,你可能需要添加以下权限(尽管qrscan2
插件通常会处理这些):
<uses-permission android:name="android.permission.CAMERA" />
此外,对于iOS,你需要在Info.plist
中添加适当的描述符来请求摄像头权限。
这个示例代码提供了一个基础框架,你可以在此基础上进行扩展,以适应你的具体需求,比如处理不同类型的二维码数据、优化用户界面等。