1:barcode_scan: ^3.0.1
优点:集成快,不需要过多的配置即可兼容。
缺点:暂时无FLutter2.0之后的空安全版本。且mac的M1芯片使用该插件无法打包。
import 'package:flutter/services.dart';
import 'package:barcode_scan/platform_wrapper.dart';
class Barcode {
//扫描得到的二维码
String _qrCode = '';
Future scan() async {
try {
var result = await BarcodeScanner.scan();
String scanData = result.rawContent;
_qrCode = scanData;
print('扫码结果: ' + _qrCode.toString());
} on PlatformException catch (e) {
if (e.code == BarcodeScanner.cameraAccessDenied) {
// 未授予APP相机权限
print('未授予APP相机权限');
} else {
// 扫码错误
print('扫码错误: $e');
}
} on FormatException {
// 进入扫码页面后未扫码就返回
print('进入扫码页面后未扫码就返回');
} catch (e) {
// 扫码错误
print('扫码错误: $e');
}
return _qrCode;
}
String get qrCode => _qrCode;
set qrCode(String value) {
_qrCode = value;
}
}
使用
Barcode barcode = new Barcode();
barcode.scan();
2:scan: ^0.0.7(flutter2.0前的最后一个版本)
优点:版本更新快,Flutter2.0有空安全版本。可以自定义扫码界面,可扩展性强。
缺点:可能低版本的在android的个别机型会出现一些问题。
仅供参考
import 'package:flutter/material.dart';
import '../styles/app_style.dart';
import 'package:scan/scan.dart';
class BarcodeScan extends StatefulWidget {
final Function scanCode;
const BarcodeScan({Key key, this.scanCode}) : super(key: key);
@override
_BarcodeScanState createState() => _BarcodeScanState();
}
class _BarcodeScanState extends State<BarcodeScan> {
ScanController controller = ScanController();
bool flashFlag = false;
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Stack(
children: [_scan(), _backIcon(), _title(), _hintText(), _flashIcon()],
),
),
);
}
Widget _scan() {
///加column防止页面报错
return Column(
children: [
Expanded(
child: Container(
child: ScanView(
controller: controller,
scanAreaScale: .7,
scanLineColor: KColor.primaryColor,
onCapture: (qrCode) {
setState(() {
Navigator.pop(context);
widget.scanCode(qrCode);
});
},
),
)),
],
);
}
/// < 返回
Widget _backIcon() {
return Padding(
padding: EdgeInsets.only(left: 15.px, top: 55.px),
child: InkWell(
child: Icon(
Icons.arrow_back_ios_outlined,
color: Colors.white,
),
onTap: () => Navigator.pop(context),
),
);
}
Widget _title() {
return Padding(
padding: EdgeInsets.only(left: 165.px, top: 55.px),
child: Text(
'扫一扫',
style: TextStyle(fontSize: 15.px, color: Colors.white),
),
);
}
Widget _hintText() {
return Padding(
padding: EdgeInsets.only(left: 87.px, top: 555.px),
child: Text(
'将二维码放入框内,即可自动扫码',
style: TextStyle(fontSize: 12.px, color: Colors.white),
),
);
}
Widget _flashIcon() {
return Container(
margin: EdgeInsets.only(left: 332.px, top: 55.px),
width: 27.px,
child: InkWell(
child: Image.asset(
flashFlag
? 'images/icon-flash-on.png'
: 'images/icon-flash-off.png',
color: Colors.white,
),
onTap: () {
setState(() {
controller.toggleTorchMode();
flashFlag = !flashFlag;
});
},
),
);
}
}
使用
Navigator.of(context).push(new MaterialPageRoute(builder: (_) {
return new BarcodeScan(scanCode: (qrCode){print('$qrCode');});
}));
下面是图片
闪光灯图片:
icon-flash-off.png
icon-flash-on.png
若不喜欢上面图片的话可以上图库自行搜索下载
https://www.iconfont.cn/home/index
关于选择本地图片扫描之类的可以参考官方文档进行查阅
https://pub.dev/packages/scan/versions/0.0.7