Flutter条码扫描插件lono_scan的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter条码扫描插件lono_scan的使用

欢迎使用lono_scan插件来实现Flutter应用中的条码扫描功能。以下是详细的使用指南。

准备工作

iOS

Info.plist文件中添加以下配置:

<key>NSCameraUsageDescription</key>
<string>您的描述</string>

<key>io.flutter.embedded_views_preview</key>
<string>YES</string>

Android

AndroidManifest.xml文件中添加以下配置:

<uses-permission android:name="android.permission.CAMERA" />

<application>
  <meta-data
    android:name="flutterEmbedding"
    android:value="2" />
</application>

pubspec.yaml文件中添加lono_scan依赖:

dependencies:
  lono_scan: ^最新版本

导入包:

import 'package:lono_scan/lono_scan.dart';

使用方法

在widget中展示扫描视图

你可以通过LonoScanView来展示扫描界面,并自定义扫描区域和其他参数。

LonoScanController controller = LonoScanController();
String qrcode = '';

Container(
  width: 350, // 自定义包裹大小
  height: 350,
  child: LonoScanView(
    controller: controller,
    // 自定义扫描区域,如果设置为1.0,则会扫描整个区域
    scanAreaScale: .8,
    scanLineColor: Colors.green.shade400,
    onCapture: (data) {
      // 执行某些操作
    },
  ),
),

控制相机

你可以使用controller.resume()controller.pause()方法来控制相机的开启和暂停。

controller.resume();
controller.pause();

从图片路径解析二维码

你可以通过LonoScan.parse方法从图片路径中获取二维码字符串。

String result = await LonoScan.parse(imagePath);

切换手电筒模式

你可以通过controller.toggleTorchMode()方法来切换手电筒模式。

controller.toggleTorchMode();

销毁控制器

使用完后,记得调用controller.dispose()来释放资源。

controller.dispose();

ProGuard规则

为了确保插件正常运行,你可能需要在proguard-rules.pro文件中添加以下规则:

-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}

致谢

lono_scan插件是在scan插件的基础上进行更新的。 原始插件链接:https://pub.dev/packages/scan

许可证

该插件采用MIT许可证。


完整示例代码

下面是完整的示例代码,展示了如何使用lono_scan插件来实现条码扫描功能。

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'package:lono_scan/lono_scan.dart';

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

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  String qrcode = '';

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

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await LonoScan.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => Scaffold(
          backgroundColor: Colors.white,
          appBar: AppBar(
            backgroundColor: Colors.orange,
            centerTitle: true,
            title: const Text('Lono scan example app'),
          ),
          body: Center(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Text(
                    'Running on: $_platformVersion',
                    style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500),
                  ),
                  const SizedBox(height: 20),
                  Row(
                    children: [
                      _buildActionButton(
                        label: 'Scan from Image',
                        icon: Icons.image,
                        onPressed: () async {
                          ImagePicker picker = ImagePicker();
                          final XFile? res = await picker.pickImage(source: ImageSource.gallery);

                          if (res != null) {
                            String? str = await LonoScan.parse(res.path);
                            if (str != null) {
                              setState(() {
                                qrcode = str;
                              });
                            } else {
                              setState(() {
                                qrcode = 'Null';
                              });
                            }
                          }
                        },
                      ),
                      const SizedBox(width: 16),
                      _buildActionButton(
                        label: 'Scan Page',
                        icon: Icons.qr_code_scanner,
                        onPressed: () {
                          Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => LonoScanPage()),
                          );
                        },
                      ),
                    ],
                  ),
                  const SizedBox(height: 30),
                  Container(
                    width: double.infinity,
                    padding: const EdgeInsets.all(12),
                    decoration: BoxDecoration(
                      color: Colors.orange.shade50,
                      borderRadius: BorderRadius.circular(10),
                      border: Border.all(color: Colors.orange.shade300),
                    ),
                    child: Column(
                      children: [
                        Text(
                          'Scan result:',
                          style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.orange.shade700),
                        ),
                        const SizedBox(height: 8),
                        Text(
                          qrcode.isNotEmpty ? qrcode : 'No result',
                          style: TextStyle(fontSize: 16, color: Colors.black87),
                          textAlign: TextAlign.center,
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      },
    );
  }

  Widget _buildActionButton({
    required String label,
    required IconData icon,
    required VoidCallback onPressed,
  }) {
    return Expanded(
      child: ElevatedButton.icon(
        onPressed: onPressed,
        icon: Icon(
          icon,
          size: 20,
          color: Colors.white,
        ),
        label: Text(label),
        style: ElevatedButton.styleFrom(
          backgroundColor: Colors.orange,
          foregroundColor: Colors.white,
          padding: const EdgeInsets.symmetric(vertical: 16),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
          ),
          elevation: 4,
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用lono_scan条码扫描插件的示例代码。lono_scan是一个用于Flutter的条码扫描插件,它提供了扫描一维码和二维码的功能。

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

dependencies:
  flutter:
    sdk: flutter
  lono_scan: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在Flutter项目中使用lono_scan插件。以下是一个简单的示例,展示如何启动条码扫描并处理扫描结果:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Barcode Scanner Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BarcodeScannerScreen(),
    );
  }
}

class BarcodeScannerScreen extends StatefulWidget {
  @override
  _BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}

class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
  String? scanResult;

  Future<void> _scanBarcode() async {
    try {
      String result = await LonoScan.scanBarcode();
      setState(() {
        scanResult = result;
      });
    } catch (e) {
      print('Error scanning barcode: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _scanBarcode,
              child: Text('Scan Barcode'),
            ),
            if (scanResult != null)
              Text(
                'Scan Result: $scanResult',
                style: TextStyle(fontSize: 20),
              ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含一个按钮用于启动条码扫描。扫描结果将显示在按钮下方。

以下是关键步骤:

  1. 添加依赖:在pubspec.yaml中添加lono_scan依赖。
  2. 导入插件:在Dart文件中导入lono_scan包。
  3. 启动扫描:使用LonoScan.scanBarcode()方法启动条码扫描。
  4. 处理结果:扫描完成后,处理返回的结果并更新UI。

确保你已经在Android和iOS项目中配置了必要的权限,以便能够访问相机。在Android中,你需要在AndroidManifest.xml中添加相机权限,如下所示:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

在iOS中,你需要在Info.plist中添加相机使用说明(NSCameraUsageDescription)。

<key>NSCameraUsageDescription</key>
<string>This app needs access to the camera to scan barcodes.</string>

这样,你就可以在Flutter项目中使用lono_scan插件进行条码扫描了。

回到顶部