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

1 回复

更多关于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.xmlInfo.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();
  }
}
回到顶部