如何实现支持摄像头二维码扫描的Flutter自定义Widget

前些日子写了一个flutter_barcode_sdk,配合已经存在的Flutter camera插件可以实现摄像头扫码 - 从Java层获取摄像头数据,通过Dart传递,再到Java去做解码。这个过程可以优化。这篇文章的目的是把摄像头控制和二维码扫描合并到Android代码里,然后封装出一整个Flutter插件。

基于Android TextView的Flutter自定义Widget

根据官方文档,我们先做一个最简单的自定义widget。

  1. 创建插件工程:

    flutter create --org com.dynamsoft --template=plugin --platforms=android -a java flutter_qrcode_scanner
    
  2. 打开lib/flutter_qrcode_scanner.dart文件,把自动生成的代码替换成:

     class ScannerView extends StatefulWidget {
       const ScannerView({Key? key}) : super(key: key);
       @override
       State<StatefulWidget> createState() => _ScannerViewState();
     }
        
     class _ScannerViewState extends State<ScannerView> {
       @override
       void initState() {
         super.initState();
       }
        
       @override
       Widget build(BuildContext context) {
         const String viewType = 'com.dynamsoft.flutter_qrcode_scanner/nativeview';
         final Map<String, dynamic> creationParams = <String, dynamic>{};
        
         return AndroidView(
           viewType: viewType,
           creationParams: creationParams,
           creationParamsCodec: const StandardMessageCodec(),
         );
       }
     }    
    
  3. 在Android目录下创建一个NativeView.java文件。创建一个TextView,并在getView()中返回:

    import android.content.Context;
     import android.graphics.Color;
     import android.view.View;
     import android.widget.TextView;
     import androidx.annotation.NonNull;
     import androidx.annotation.Nullable;
     import io.flutter.plugin.platform.PlatformView;
     import java.util.Map;
        
     class NativeView implements PlatformView {
         
         @NonNull private final TextView textView;
         
          NativeView(@NonNull Context context, int id, @Nullable Map<String, Object> creationParams) {
         
              textView = new TextView(context);
              textView.setTextSize(72);
              textView.setBackgroundColor(Color.rgb(255, 255, 255));
              textView.setText("Rendered on a native Android view (id: " + id + ")");
          }
         
          @NonNull
          @Override
          public View getView() {
         
              return textView;
          }
         
          @Override
          public void dispose() {
         }
     }
    

    接下来创建NativeViewFactory.java,用于初始化NativeView

     import android.content.Context;
     import android.view.View;
     import androidx.annotation.Nullable;
     import androidx.annotation.NonNull;
     import io.flutter.plugin.common.BinaryMessenger;
     import io.flutter.plugin.common.StandardMessageCodec;
     import io.flutter.plugin.platform.PlatformView;
     import io.flutter.plugin.platform.PlatformViewFactory;
     import java.util.Map;
    
     class NativeViewFactory extends PlatformViewFactory {
         
       @NonNull private final BinaryMessenger messenger;
    
       NativeViewFactory(@NonNull BinaryMessenger messenger) {
         
         super(StandardMessageCodec.INSTANCE);
         this.messenger = messenger;
       }
    
       @NonNull
       @Override
       public PlatformView create(@NonNull Context context, int id, @Nullable Object args) {
         
         final Map<String, Object> creationParams = (Map<String, Object>) args;
         return new NativeView(context, id, creationParams);
       }
     }
    

    在自动生成的FlutterQrcodeScannerPlugin.java中,注册NativeViewFactory:

    @Override
     public void onAttachedToEngine
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Flutter 应用程序中实现二维码扫描,可以使用 `qr_code_scanner` 或 `barcode_scan` 插件。 `qr_code_scanner` 插件提供了一个 `QRView` widget,可以轻松地将二维码扫描器集成到应用程序中。以下是一个简单的示例: 1. 添加 `qr_code_scanner` 插件到 `pubspec.yaml` 文件中: ``` dependencies: qr_code_scanner: ^0.4.3 ``` 2. 导入 `qr_code_scanner` 包: ``` import 'package:qr_code_scanner/qr_code_scanner.dart'; ``` 3. 创建一个 `QRViewController` 和一个 `QRView`: ``` QRViewController controller; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); @override Widget build(BuildContext context) { return QRView( key: qrKey, onQRViewCreated: _onQRViewCreated, ); } void _onQRViewCreated(QRViewController controller) { this.controller = controller; controller.scannedDataStream.listen((scanData) { // 处理扫描到的二维码 }); } ``` 当用户扫描二维码时,`QRViewController` 会不断发送扫描数据到 `scannedDataStream`,可以在监听函数中处理这些数据。 如果想要更多的控制权,可以使用 `barcode_scan` 插件。这个插件提供了一个 `scan()` 方法,可以启动一个新的扫描器界面,并且可以自定义扫描器的外观和行为。以下是一个简单的示例: 1. 添加 `barcode_scan` 插件到 `pubspec.yaml` 文件中: ``` dependencies: barcode_scan: ^2.0.0 ``` 2. 导入 `barcode_scan` 包: ``` import 'package:barcode_scan/barcode_scan.dart'; ``` 3. 调用 `scan()` 方法并处理返回的数据: ``` Future<void> scan() async { String barcode = await BarcodeScanner.scan(); // 处理扫描到的二维码 } ``` 在调用 `scan()` 方法时,会启动一个新的扫描器界面,并等待用户扫描二维码。当用户扫描二维码后,会返回扫描到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值