Flutter苹果设备视觉扫描插件apple_vision_scanner的使用

Flutter苹果设备视觉扫描插件apple_vision_scanner的使用

apple_vision_scanner 是一个用于在Flutter应用中使用Apple Vision条形码扫描功能的插件。以下是该插件的详细使用说明。

apple_vision_scanner

Apple Vision 条形码扫描器是一个使Flutter应用程序能够使用 Apple Vision 条形码扫描 的插件。

  • 此插件不是由Apple赞助或维护的。作者是希望为macOS创建类似Google ML Kit插件的开发者。

要求

MacOS

  • 最低osx部署目标:10.13
  • Xcode 13 或更新版本
  • Swift 5
  • ML Kit仅支持64位架构(x86_64 和 arm64)

iOS

  • 最低ios部署目标:11.0
  • Xcode 13 或更新版本
  • Swift 5
  • ML Kit仅支持64位架构(x86_64 和 arm64)

开始使用

首先需要导入 apple_vision 包:

import 'package:apple_vision/apple_vision.dart';

接下来是完整的示例代码:

import 'dart:typed_data';

import 'package:apple_vision_scanner/apple_vision_scanner.dart';
import 'package:flutter/material.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const VisionScanner(),
    );
  }
}

class VisionScanner extends StatefulWidget {
  const VisionScanner({
    Key? key,
    this.onScanned
  }) : super(key: key);

  final Function(dynamic data)? onScanned;

  [@override](/user/override)
  _VisionScanner createState() => _VisionScanner();
}

class _VisionScanner extends State<VisionScanner> {
  final GlobalKey cameraKey = GlobalKey(debugLabel: "cameraKey");
  AppleVisionScannerController visionController = AppleVisionScannerController();
  InsertCamera camera = InsertCamera();
  String? deviceId;
  bool loading = true;
  Size imageSize = const Size(640, 640 * 9 / 16);

  List<Barcode>? barcodeData;
  late double deviceWidth;
  late double deviceHeight;

  Uint8List? image;

  [@override](/user/override)
  void initState() {
    camera.setupCameras().then((value) {
      setState(() {
        loading = false;
      });
      camera.startLiveFeed((InputImage i) {
        if (i.metadata?.size != null) {
          imageSize = i.metadata!.size;
        }
        if (mounted) {
          Uint8List? image = i.bytes;
          visionController.processImage(
            image!,
            i.metadata!.size
          ).then((data) {
            barcodeData = data;
            setState(() {});
          });
        }
      });
    });
    super.initState();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    deviceWidth = MediaQuery.of(context).size.width;
    deviceHeight = MediaQuery.of(context).size.height;
    return Stack(
      children: [
        SizedBox(
          width: imageSize.width,
          height: imageSize.height,
          child: loading ? Container() : CameraSetup(camera: camera, size: imageSize,)
        ),
      ] + showRects()
    );
  }

  List<Widget> showRects() {
    if (barcodeData == null || barcodeData!.isEmpty) return [];
    List<Widget> widgets = [];

    for (int i = 0; i < barcodeData!.length; i++) {
      widgets.add(
        Positioned(
          top: barcodeData![i].boundingBox!.top,
          left: barcodeData![i].boundingBox!.left,
          child: Container(
            width: barcodeData![i].boundingBox!.width,
            height: barcodeData![i].boundingBox!.height,
            decoration: BoxDecoration(
              color: Colors.transparent,
              border: Border.all(width: 1, color: Colors.green),
              borderRadius: BorderRadius.circular(5)
            ),
            child: Text(
              '${barcodeData![i].displayValue}: ${barcodeData![i].type}',
              style: const TextStyle(
                color: Colors.white,
                fontSize: 12
              ),
            ),
          )
        )
      );
    }
    return widgets;
  }

  Widget loadingWidget() {
    return Container(
      width: deviceWidth,
      height: deviceHeight,
      color: Theme.of(context).canvasColor,
      alignment: Alignment.center,
      child: const CircularProgressIndicator(color: Colors.blue)
    );
  }
}

更多关于Flutter苹果设备视觉扫描插件apple_vision_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter苹果设备视觉扫描插件apple_vision_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


apple_vision_scanner 是一个 Flutter 插件,用于在苹果设备上实现视觉扫描功能。它利用苹果的 Vision 框架来识别和扫描文本、条形码、二维码等。这个插件可以帮助开发者在 Flutter 应用中轻松集成苹果设备的视觉扫描功能。

以下是如何使用 apple_vision_scanner 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  apple_vision_scanner: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 apple_vision_scanner 插件:

import 'package:apple_vision_scanner/apple_vision_scanner.dart';

3. 初始化扫描器

你可以通过 AppleVisionScanner 类来初始化扫描器。例如,初始化一个二维码扫描器:

final scanner = AppleVisionScanner();

4. 开始扫描

使用 scan 方法来开始扫描。你可以传递一个图像作为输入,并指定扫描的类型(如二维码、条形码、文本等)。

final image = ... // 获取图像数据
final result = await scanner.scan(image, type: ScanType.qrCode);

if (result.isNotEmpty) {
  print('扫描结果: $result');
} else {
  print('未扫描到任何内容');
}

5. 处理扫描结果

scan 方法会返回一个包含扫描结果的列表。你可以根据需要对结果进行处理。

6. 释放资源

在不再需要使用扫描器时,记得释放资源:

scanner.dispose();

示例代码

以下是一个完整的示例代码,展示如何使用 apple_vision_scanner 插件扫描二维码:

import 'package:flutter/material.dart';
import 'package:apple_vision_scanner/apple_vision_scanner.dart';

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

class _QRScannerScreenState extends State<QRScannerScreen> {
  final scanner = AppleVisionScanner();
  String scanResult = '';

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

  Future<void> scanQRCode() async {
    final image = ... // 获取图像数据
    final result = await scanner.scan(image, type: ScanType.qrCode);

    setState(() {
      if (result.isNotEmpty) {
        scanResult = result.first;
      } else {
        scanResult = '未扫描到任何内容';
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('二维码扫描'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('扫描结果: $scanResult'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: scanQRCode,
              child: Text('开始扫描'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部