JustScanner

A high-performance QR and barcode scanner package for Flutter with support for multiple formats and optimized for lower Android versions.

Features

  • 🚀 High-performance scanning using ML Kit (Android) and Vision (iOS)
  • 📱 Support for Android API 21+ with legacy camera support
  • 🔍 Multiple barcode formats support (QR, EAN, UPC, Code128, etc.)
  • 📸 Real-time camera preview with scan area overlay
  • 🔦 Torch/flashlight control
  • ⚡ Continuous and single-shot scanning modes
  • 🎯 Configurable scan delay and frame rate
  • 📊 Barcode position and corner detection
  • 🖼️ Image analysis from bytes

Supported Formats

  • QR Code
  • Aztec
  • Data Matrix
  • PDF417
  • UPC-A / UPC-E
  • EAN-8 / EAN-13
  • Code 39 / Code 93 / Code 128
  • ITF
  • Codabar

Getting started

Add this to your package's pubspec.yaml file:

dependencies:
  just_scanner:
    path: packages/just_scanner

Platform Setup

Android

Add camera permissions to your AndroidManifest.xml:

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

iOS

Add camera usage description to your Info.plist:

<key>NSCameraUsageDescription</key>
<string>Camera access is required for scanning barcodes</string>

Usage

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

class ScannerPage extends StatefulWidget {
  @override
  _ScannerPageState createState() => _ScannerPageState();
}

class _ScannerPageState extends State<ScannerPage> {
  late JustScanner scanner;
  String? scannedCode;

  @override
  void initState() {
    super.initState();
    
    scanner = JustScanner(
      config: ScannerConfig(
        formats: [BarcodeFormat.qrCode],
        enableHapticFeedback: true,
      ),
    );
    
    scanner.listen((result) {
      setState(() {
        scannedCode = result.code;
      });
    });
  }

  @override
  void dispose() {
    scanner.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ScannerView(
        config: scanner.config,
        onScannerReady: () async {
          await scanner.initialize();
          await scanner.startScanning();
        },
      ),
    );
  }
}

Additional information

For more examples and advanced usage, check the documentation.

Libraries

just_scanner