我釋出的第二個Flutter外掛-Flutter二維碼掃描(支援檔案、url、記憶體、相機)

rhyme_lph發表於2019-11-23

介紹

二維碼作為資訊的載體,廣泛應用於我們生活的方方面面,例如:使用支付寶支付,二維碼加好友,二維碼推廣等等,能舉例的例子多不勝數,而如果你的應用支援二維碼的掃描,使用者和體驗將會翻倍的增長,如果你是應用的開發者,歡迎來使用此二維碼掃描外掛!並希望能給予專案一個star,謝謝!專案地址:github.com/rhymelph/r_…

使用

你可以在pub.dev網站上面搜尋r_scan即可找到該外掛,新增下面程式碼到pubspec.yaml檔案

dependencies:
    r_scan: last version
複製程式碼
  • last version 可以在pub.dev網站搜尋r_scan得到

各裝置註意事項

  • Android平臺下

android6.0系統以上請動態授權,可以結合permission_handler外掛使用,程式碼如下:

import 'package:permission_handler/permission_handler.dart';

Future<bool> canReadStorage() async {
    if(Platform.isIOS) return true;
    var status = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.storage]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }

Future<bool> canOpenCamera() async {
    var status =
        await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.camera]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }
複製程式碼
  • IOS平臺下

需要在info.plist檔案下新增如下程式碼:

    <key>NSCameraUsageDescription</key>
	<string>掃描二維碼時需要使用您的相機</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>掃描二維碼時需要訪問您的相簿</string>
	<key>io.flutter.embedded_views_preview</key>
    <true/>
複製程式碼

導包

import 'package:r_scan/r_scan.dart';
複製程式碼

1.掃描檔案圖片二維碼

final result=await RScan.scanImagePath('你的檔案路徑');
if(result.isNotEmpty){
    //result 為二維碼內容
}
複製程式碼

2.掃描圖片連結二維碼

final result=await RScan.scanImagePath('你的圖片連結');
if(result.isNotEmpty){
    //result 為二維碼內容
}
複製程式碼

3.掃描記憶體圖片二維碼

ByteData data=await rootBundle.load('images/qrCode.png');
final result=await RScan.scanImageMemory(data.buffer.asUint8List());
if(result.isNotEmpty){
    //result 為二維碼內容
}
複製程式碼

4.使用相機掃描二維碼

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

class RScanDialog extends StatefulWidget {
  @override
  _RScanDialogState createState() => _RScanDialogState();
}

class _RScanDialogState extends State<RScanDialog> {
  RScanController _controller;

  @override
  void initState() {
    super.initState();
    initController();
  }
  bool isFirst=true;


  Future<void> initController() async {
    _controller = RScanController();
    _controller.addListener(() {//監聽掃描到的二維碼
      final result = _controller.result;
      if (result != null) {
        if(isFirst){
          Navigator.of(context).pop(result);
          isFirst=false;
        }
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.black,
        body: FutureBuilder<bool>(
          future: canOpenCameraView(),
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.hasData && snapshot.data == true) {
              return ScanImageView(//這個為自己寫的前景
                child: RScanView(
                  controller: _controller,
                ),
              );
            } else {
              return Container();
            }
          },
        ),
      ),
    );
  }

  Future<bool> canOpenCameraView() async {
    var status =
        await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.camera]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }
}
複製程式碼

後續開發

  1. 支援手電筒
  2. 支援自定義區域觸發掃描
  3. 還有更多...

相關文章