Flutter二维码扫描插件tek_flutter_qrscanner的使用

Flutter二维码扫描插件tek_flutter_qrscanner的使用

简介

tek_flutter_qrscanner 是一个用于在 Flutter 应用中实现原生二维码扫描功能(支持 Android 和 iOS)的插件。

设置

Android

无需任何设置,直接使用即可。

iOS

请发送邮件至 hoa.ctp@teko.vn 获取访问 Teko iOS 框架的访问令牌。详细设置请参阅 /example 目录下的 README.md 文件。

如何使用

步骤1: 创建 TekFlutterScannerConfig 类来定义配置
class TekFlutterScannerConfig {
  const TekFlutterScannerConfig({
    required this.showAppBar,
    required this.appBarTitle,
    required this.appBarColor,
    required this.description
  });

  final bool showAppBar;
  final String appBarTitle;
  final String appBarColor;
  final String description;
}

你可以查看 /example/lib/tek_flutter_qrscanner.dart 文件获取更多细节。

步骤2: 准备数据并发送给原生层
...
final _tekFlutterQrscannerPlugin = TekFlutterQrscanner(); // 创建插件实例
...
var config = const TekFlutterScannerConfig(
    showAppBar: true,
    appBarTitle: "Scan QR",
    appBarColor: "#FBAF17",
    description: "Scan processing"); // 创建 `config` 实例来定义屏幕配置
var result = await _tekFlutterQrscannerPlugin.getScreen(json.encode(config.toMap())); 
// `config` 必须编码为 JSON 字符串后才能发送到原生层
// `result` 是一个字符串,表示扫描结果,如果原生层点击返回按钮,则 `result` 将为 null

完整示例 Demo

以下是完整的示例代码:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:tek_flutter_qrscanner/tek_flutter_qrscanner.dart';
import 'package:tek_flutter_qrscanner_example/tek_flutter_scanner_config.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _tekFlutterQrscannerPlugin = TekFlutterQrscanner();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: ElevatedButton(
            child: const Text("Open module"),
            onPressed: () async {
              var config = const TekFlutterScannerConfig(
                  showAppBar: true,
                  appBarTitle: "Quét mã",
                  appBarColor: "#FBAF17",
                  description: "Di chuyển Camera đến vùng chứa mã QR, tiến trình\nquét mã sẽ diễn ra tự động");

              var result = await _tekFlutterQrscannerPlugin.getScreen(json.encode(config.toMap()));
              Fluttertoast.showToast(msg: result.toString());
            },
          ),
        ),
      ),
    );
  }
}

更多关于Flutter二维码扫描插件tek_flutter_qrscanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter二维码扫描插件tek_flutter_qrscanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


tek_flutter_qrscanner 是一个用于 Flutter 的二维码扫描插件。它提供了一个简单易用的接口,可以在你的 Flutter 应用中快速集成二维码扫描功能。

安装

首先,你需要在 pubspec.yaml 文件中添加 tek_flutter_qrscanner 依赖:

dependencies:
  flutter:
    sdk: flutter
  tek_flutter_qrscanner: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用

  1. 导入包

    在你的 Dart 文件中导入 tek_flutter_qrscanner

    import 'package:tek_flutter_qrscanner/tek_flutter_qrscanner.dart';
    
  2. 初始化扫描器

    你需要在 initState 中初始化扫描器:

    [@override](/user/override)
    void initState() {
      super.initState();
      TekFlutterQrScanner.init();
    }
    
  3. 启动扫描

    你可以使用 TekFlutterQrScanner.scan 方法来启动二维码扫描:

    void _scanQRCode() async {
      String qrResult = await TekFlutterQrScanner.scan();
      if (qrResult != null) {
        print("Scanned QR Code: $qrResult");
      } else {
        print("No QR Code scanned.");
      }
    }
    
  4. 在 UI 中使用

    你可以在按钮的 onPressed 事件中调用 _scanQRCode 方法来启动扫描:

    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('QR Code Scanner'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _scanQRCode,
            child: Text('Scan QR Code'),
          ),
        ),
      );
    }
    

处理权限

在某些平台上(如 Android),你可能需要请求相机权限才能使用二维码扫描功能。你可以使用 permission_handler 插件来处理权限请求。

  1. 添加 permission_handler 依赖

    dependencies:
      permission_handler: ^10.0.0  # 请使用最新版本
    
  2. 请求相机权限

    在启动扫描之前,检查并请求相机权限:

    import 'package:permission_handler/permission_handler.dart';
    
    void _requestCameraPermission() async {
      var status = await Permission.camera.status;
      if (!status.isGranted) {
        await Permission.camera.request();
      }
    }
    
    void _scanQRCode() async {
      _requestCameraPermission();
      String qrResult = await TekFlutterQrScanner.scan();
      if (qrResult != null) {
        print("Scanned QR Code: $qrResult");
      } else {
        print("No QR Code scanned.");
      }
    }
    

自定义扫描界面

tek_flutter_qrscanner 允许你自定义扫描界面的外观。你可以通过传递参数来调整扫描框的大小、颜色等。

例如:

String qrResult = await TekFlutterQrScanner.scan(
  scanBoxColor: Colors.blue,
  scanLineColor: Colors.red,
  scanBoxSize: 200.0,
);

注意事项

  • 确保在 AndroidManifest.xmlInfo.plist 中添加必要的相机权限和配置。

  • 在 iOS 上,你需要在 Info.plist 中添加以下键值对来请求相机权限:

    <key>NSCameraUsageDescription</key>
    <string>We need access to your camera to scan QR codes.</string>
    

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:tek_flutter_qrscanner/tek_flutter_qrscanner.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'QR Code Scanner',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: QRCodeScannerScreen(),
    );
  }
}

class QRCodeScannerScreen extends StatefulWidget {
  [@override](/user/override)
  _QRCodeScannerScreenState createState() => _QRCodeScannerScreenState();
}

class _QRCodeScannerScreenState extends State<QRCodeScannerScreen> {
  [@override](/user/override)
  void initState() {
    super.initState();
    TekFlutterQrScanner.init();
  }

  void _requestCameraPermission() async {
    var status = await Permission.camera.status;
    if (!status.isGranted) {
      await Permission.camera.request();
    }
  }

  void _scanQRCode() async {
    _requestCameraPermission();
    String qrResult = await TekFlutterQrScanner.scan(
      scanBoxColor: Colors.blue,
      scanLineColor: Colors.red,
      scanBoxSize: 200.0,
    );
    if (qrResult != null) {
      print("Scanned QR Code: $qrResult");
    } else {
      print("No QR Code scanned.");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _scanQRCode,
          child: Text('Scan QR Code'),
        ),
      ),
    );
  }
}
回到顶部