Flutter中使用barcode_scan_fix实现二维码扫描

1. 安装插件

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  date_format: ^1.0.6
  flutter_cupertino_date_picker: ^1.0.26+2 
  flutter_swiper: ^1.1.6
  fluttertoast: ^7.1.6
  http: ^0.12.2
  dio: ^3.0.10
  flutter_html: ^1.1.0
  flutter_inappwebview: ^4.0.0+4
  device_info: ^1.0.0
  amap_location: ^0.2.0
  image_picker: ^0.6.7+21
  video_player: ^1.0.1
  chewie: ^0.12.2
  connectivity: ^2.0.2
  shared_preferences: ^0.5.12+4

  # 二维码扫描插件
  barcode_scan_fix: ^1.0.2

在pubspec.yaml中配置保存后,在VS Code环境中会自动下载依赖包。

如果无法正常下载,执行 flutter pub get 

2. 配置权限

1. 安卓配置。

第一步:如下图所示,按第一个红框里所示的路径找到该文件,添加第二个红框和第三个红框里的代码;

要添加的代码如下:

<!-- 照相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- 二维码扫描 -->
<activity android:name="com.apptreesoftware.barcodescan.BarcodeScannerActivity"/>

 第二步:检查如下图第一个红框里所示的路径文件,是否有第二和第三个红框里的代码;

要添加的代码如下:

buildscript {
    ext.kotlin_version = '1.3.50'
    ...
    dependencies {
        ...
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

 第三步:检查如下图第一个红框里所示的路径文件,是否有第二和第三个红框里的代码; 

要添加的代码如下:

apply plugin: 'kotlin-android'
...
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    ...
}

2. IOS配置。

如下图所示,按第一个红框里所示的路径找到该文件,添加第二个红框里面的代码。

要添加的代码如下:

<key>NSCameraUsageDescription</key>
<string>Camera permission is required for barcode scanning.</string>

3. 引入插件

在需要用到的该插件的文件中引入插件包。

import 'package:barcode_scan_fix/barcode_scan.dart';

4. 使用插件

String barcode;

Future _scan() async {
    try {
        String barcode = await BarcodeScanner.scan();
        setState(() {
            this.barcode = barcode;
        });

    } on PlatformException catch (e) {
        if (e.code == BarcodeScanner.CameraAccessDenied) {
            setState(() {
                this.barcode = 'The user did not grant the camera permission!';
            });
        } else {
            setState(() {
                return this.barcode = 'Unknown error: $e';
            });
        }
    } on FormatException {
        setState(() {
            this.barcode ='null (User returned using the "back"-button before scanning anything. Result)';
        });
    } catch (e) {
        setState((){
            this.barcode = 'Unknown error: $e';
        });
    }
}

6. 完整示例

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// 引入插件
import 'package:barcode_scan_fix/barcode_scan.dart';

class ScanPage extends StatefulWidget {
    ScanPage({Key key}) : super(key: key);
    _ScanPageState createState() => _ScanPageState();
}

class _ScanPageState extends State<ScanPage> {

    // 定义变量存储扫描结果
    String barcode;
    // 扫描方法
    Future _scan() async {
        try {
            String barcode = await BarcodeScanner.scan();
            setState(() {
                this.barcode = barcode;
            });

        } on PlatformException catch (e) {
            if (e.code == BarcodeScanner.CameraAccessDenied) {
                setState(() {
                    this.barcode = 'The user did not grant the camera permission!';
                });
            } else {
                setState(() {
                    return this.barcode = 'Unknown error: $e';
                });
            }
        } on FormatException {
            setState(() {
                this.barcode ='null (User returned using the "back"-button before scanning anything. Result)';
            });
        } catch (e) {
            setState((){
                this.barcode = 'Unknown error: $e';
            });
        }
    }

    @override
    Widget build(BuildContext context) {
        return Scaffold(
            floatingActionButton: FloatingActionButton(
                child: Icon(Icons.photo_camera),
                // 点击扫描
                onPressed: _scan,
            ),
            appBar: AppBar(
                title: Text("扫码"),
            ),
            body: Text("${barcode}")
        );
    }
}

7.错误解决

在项目编译时,可能会出现如下所示的错误。

Android dependency ‘androidx.core:core’ has different version for the compile (1.0.0) and runtime (1.0.2) classpath. You should manually set the same version via DependencyResolution。

解决方案如下:

参考:

https://pub.flutter-io.cn/packages/barcode_scan_fix 

猜你喜欢

转载自blog.csdn.net/weixin_40629244/article/details/113144609