flutter_imin_lark_scanner 1.0.0 copy "flutter_imin_lark_scanner: ^1.0.0" to clipboard
flutter_imin_lark_scanner: ^1.0.0 copied to clipboard

Flutter plugin for the built-in barcode scanner on iMIN Lark Android devices, with continuous scanning and lifecycle support.

example/lib/main.dart

import 'dart:async';

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

void main() => runApp(const MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(debugShowCheckedModeBanner: false, home: ScannerPage());
  }
}

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

class _ScannerPageState extends State<ScannerPage> {
  String? _scannedData;
  StreamSubscription<String>? _scanSubscription;
  StreamSubscription<void>? _stateSubscription;
  late final ContinuousScanSession _session;

  @override
  void initState() {
    super.initState();

    _session = FlutterIminLarkScanner.instance.createContinuousSession();
    _scanSubscription = _session.scans.listen(
      (value) {
        if (!mounted) return;
        setState(() => _scannedData = value);
      },
      onError: (error) {
        debugPrint('Scan stream error: $error');
      },
    );
    _stateSubscription = _session.stateChanges.listen((_) {
      if (!mounted) return;
      setState(() {});
    });

    unawaited(_session.start());
  }

  @override
  void dispose() {
    _scanSubscription?.cancel();
    _stateSubscription?.cancel();
    _session.dispose();
    super.dispose();
  }

  String get _statusText {
    if (_session.isActive) {
      return 'Scanner active';
    }
    if (_session.isStarting) {
      return 'Scanner starting...';
    }
    return 'Scanner stopped';
  }

  String get _subtitleText {
    if (_session.isActive) {
      return 'Resumes 3 seconds after each scan';
    }
    if (_session.isStarting) {
      return 'Please wait';
    }
    return 'Tap start to resume scanning';
  }

  bool get _showStopButton => _session.isActive || _session.isStarting;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('IMIN Scanner')),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(
                Icons.qr_code_scanner,
                size: 64,
                color: Theme.of(context).colorScheme.primary,
              ),
              const SizedBox(height: 16),
              Text(_statusText, style: Theme.of(context).textTheme.titleMedium),
              const SizedBox(height: 8),
              Text(
                _subtitleText,
                style: Theme.of(context).textTheme.bodySmall?.copyWith(
                  color: Theme.of(context).colorScheme.onSurfaceVariant,
                ),
              ),
              const SizedBox(height: 24),
              if (_showStopButton)
                FilledButton.tonal(
                  onPressed: _session.isStarting
                      ? null
                      : () async {
                          await _session.stop();
                        },
                  child: const Text('Stop Scanner'),
                )
              else
                FilledButton(
                  onPressed: () async {
                    await _session.resume();
                  },
                  child: const Text('Start Scanner'),
                ),
              const SizedBox(height: 32),
              Text(
                _scannedData ?? 'No scan yet',
                textAlign: TextAlign.center,
                style: Theme.of(context).textTheme.titleMedium?.copyWith(
                  color: _scannedData == null
                      ? Theme.of(context).colorScheme.onSurfaceVariant
                      : null,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
1
likes
150
points
181
downloads

Documentation

API reference

Publisher

verified publisherpatel-apps.com

Weekly Downloads

Flutter plugin for the built-in barcode scanner on iMIN Lark Android devices, with continuous scanning and lifecycle support.

Repository
View/report issues

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on flutter_imin_lark_scanner

Packages that implement flutter_imin_lark_scanner