Flutter身份证扫描插件tr_id_scanner的使用
Flutter身份证扫描插件tr_id_scanner的使用
特性
该插件允许通过扫描身份证来获取数据。
使用方法
要使用 tr_id_scanner
插件,你需要在你的项目中导入它。以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'package:tr_id_scanner/tr_id_scanner.dart';
import 'package:tr_id_scanner/model/kimlik_model.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: '身份证扫描器',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TextEditingController nameTEController = TextEditingController();
TextEditingController kimlikTcController = TextEditingController();
TextEditingController dobTEController = TextEditingController();
TextEditingController dogumTarihiController = TextEditingController();
TextEditingController sonGecerlilikController = TextEditingController();
TextEditingController seriNoController = TextEditingController();
/// 初始化模型类,因为该插件的方法将返回一个KimlikModel类型的对象
KimlikModel _kimlikModel = KimlikModel();
Future<void> scanIDCard(ImageSource imageSource) async {
/// 需要传递一个"ImageSource"类型的参数
KimlikModel kimlikModel = await TrIdScanner.scanImage(imageSource: imageSource);
_kimlikModel = kimlikModel;
setState(() {
kimlikTcController.text = _kimlikModel.kimlikNumarasi;
dogumTarihiController.text = _kimlikModel.kimlikIssueDate;
sonGecerlilikController.text = _kimlikModel.kimlikExpiryDate;
seriNoController.text = _kimlikModel.seriNo;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Container(
margin: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 25),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 18),
Expanded(
child: ListView(
padding: const EdgeInsets.all(0),
shrinkWrap: true,
children: [
_idField(textEditingController: kimlikTcController),
_dataField(
text: '出生日期',
textEditingController: dogumTarihiController),
_dataField(
text: '卡片有效期',
textEditingController: sonGecerlilikController),
_dataField(
text: '序列号',
textEditingController: seriNoController),
SizedBox(height: 20),
_getScanIDCardBtn(),
],
),
)
],
),
),
);
}
Widget _idField({TextEditingController textEditingController}) {
return Card(
elevation: 7,
margin: const EdgeInsets.only(top: 2.0, bottom: 5.0),
child: Container(
margin: const EdgeInsets.only(top: 2.0, bottom: 1.0, left: 0.0, right: 0.0),
child: IntrinsicHeight(
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
width: 3,
height: 45,
margin: const EdgeInsets.only(left: 3.0, right: 7.0),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [],
stops: [0.0, 0.5, 1.0],
tileMode: TileMode.mirror,
end: Alignment.bottomCenter,
begin: Alignment.topRight),
borderRadius: BorderRadius.circular(5),
),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'身份证号码',
style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold),
),
SizedBox(height: 5),
Row(
children: [
Expanded(
child: TextField(
controller: textEditingController,
decoration: InputDecoration(
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.only(left: 5.0),
),
style: TextStyle(fontWeight: FontWeight.bold),
textInputAction: TextInputAction.done,
keyboardType: TextInputType.number,
textAlign: TextAlign.left,
),
)
],
)
],
),
),
],
),
),
),
);
}
Widget _dataField(
{String text,
TextEditingController textEditingController}) {
return Card(
elevation: 5,
margin: const EdgeInsets.only(top: 10, bottom: 5),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Padding(padding: const EdgeInsets.only(left: 5)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Padding(
padding: const EdgeInsets.only(left: 15.0, top: 5, bottom: 3),
child: Text(
text.toUpperCase(),
style: TextStyle(fontSize: 12, fontWeight: FontWeight.bold),
),
),
Padding(
padding: const EdgeInsets.only(left: 15.0, bottom: 5),
child: TextField(
controller: textEditingController,
decoration: InputDecoration(
hintText: (text == "姓名") ? "" : textEditingController.text,
border: InputBorder.none,
isDense: true,
hintStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
contentPadding: EdgeInsets.all(0),
),
style: TextStyle(fontWeight: FontWeight.bold),
textInputAction: TextInputAction.done,
keyboardType: (text == "姓名")
? TextInputType.text
: TextInputType.number,
textAlign: TextAlign.left,
),
),
],
),
),
],
));
}
Widget _getScanIDCardBtn() {
return RaisedButton(
elevation: 5,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return CustomDialogBox(onCameraBTNPressed: () {
scanIDCard(ImageSource.camera);
}, onGalleryBTNPressed: () {
scanIDCard(ImageSource.gallery);
});
});
},
textColor: Colors.white,
padding: EdgeInsets.all(0.0),
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
color: Colors.black,
),
padding: const EdgeInsets.all(12.0),
child: Text('扫描身份证', style: TextStyle(fontSize: 18)),
),
);
}
}
自定义对话框
为了简化示例代码,我们使用了一个自定义对话框 CustomDialogBox
来选择相机或相册。你可以根据自己的需求实现这个对话框。
class CustomDialogBox extends StatelessWidget {
final VoidCallback onCameraBTNPressed;
final VoidCallback onGalleryBTNPressed;
CustomDialogBox({
required this.onCameraBTNPressed,
required this.onGalleryBTNPressed,
});
[@override](/user/override)
Widget build(BuildContext context) {
return AlertDialog(
title: Text('选择来源'),
actions: <Widget>[
TextButton(
child: Text('相机'),
onPressed: onCameraBTNPressed,
),
TextButton(
child: Text('相册'),
onPressed: onGalleryBTNPressed,
),
],
);
}
}
更多关于Flutter身份证扫描插件tr_id_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter身份证扫描插件tr_id_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
tr_id_scanner
是一个用于 Flutter 的身份证扫描插件,它可以帮助开发者快速集成身份证扫描功能到 Flutter 应用中。以下是使用 tr_id_scanner
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 tr_id_scanner
插件的依赖:
dependencies:
flutter:
sdk: flutter
tr_id_scanner: ^latest_version
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在需要使用身份证扫描功能的 Dart 文件中导入插件:
import 'package:tr_id_scanner/tr_id_scanner.dart';
3. 初始化插件
在使用插件之前,通常需要先初始化它:
void initScanner() async {
await TrIdScanner.initialize();
}
4. 开始扫描
调用 startScan
方法开始扫描身份证:
void startScan() async {
try {
final result = await TrIdScanner.startScan();
if (result != null) {
// 处理扫描结果
print('身份证信息: $result');
} else {
print('扫描取消或失败');
}
} catch (e) {
print('扫描出错: $e');
}
}
5. 处理扫描结果
startScan
方法返回一个包含身份证信息的对象,你可以从中提取需要的字段:
void handleScanResult(Map<String, dynamic> result) {
String name = result['name'];
String idNumber = result['idNumber'];
String address = result['address'];
String gender = result['gender'];
String nationality = result['nationality'];
String birthDate = result['birthDate'];
print('姓名: $name');
print('身份证号: $idNumber');
print('地址: $address');
print('性别: $gender');
print('民族: $nationality');
print('出生日期: $birthDate');
}
6. 权限处理
在使用身份证扫描功能时,通常需要相机权限。确保在 AndroidManifest.xml
和 Info.plist
中添加相应的权限声明,并在运行时请求权限。
Android
在 AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.CAMERA" />
iOS
在 Info.plist
中添加:
<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机以扫描身份证</string>
7. 释放资源
在不再需要扫描功能时,可以调用 release
方法释放资源:
void releaseScanner() async {
await TrIdScanner.release();
}
完整示例
以下是一个简单的完整示例:
import 'package:flutter/material.dart';
import 'package:tr_id_scanner/tr_id_scanner.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
[@override](/user/override)
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
[@override](/user/override)
void initState() {
super.initState();
initScanner();
}
void initScanner() async {
await TrIdScanner.initialize();
}
void startScan() async {
try {
final result = await TrIdScanner.startScan();
if (result != null) {
handleScanResult(result);
} else {
print('扫描取消或失败');
}
} catch (e) {
print('扫描出错: $e');
}
}
void handleScanResult(Map<String, dynamic> result) {
String name = result['name'];
String idNumber = result['idNumber'];
String address = result['address'];
String gender = result['gender'];
String nationality = result['nationality'];
String birthDate = result['birthDate'];
print('姓名: $name');
print('身份证号: $idNumber');
print('地址: $address');
print('性别: $gender');
print('民族: $nationality');
print('出生日期: $birthDate');
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('身份证扫描'),
),
body: Center(
child: ElevatedButton(
onPressed: startScan,
child: Text('开始扫描'),
),
),
);
}
[@override](/user/override)
void dispose() {
TrIdScanner.release();
super.dispose();
}
}