import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class ScanLaunchService { ScanLaunchService._(); static final ScanLaunchService instance = ScanLaunchService._(); static const _methodChannel = MethodChannel('com.example.qrscanner/scan_launch'); static const _eventChannel = EventChannel('com.example.qrscanner/scan_events'); Stream? _scanStream; bool get isAndroid => !kIsWeb && Platform.isAndroid; Stream get scanStream { _scanStream ??= _eventChannel .receiveBroadcastStream() .where((event) => event is String && event.trim().isNotEmpty) .map((event) => (event as String).trim()); return _scanStream!; } Future isSupported() async { if (!isAndroid) return false; try { final supported = await _methodChannel.invokeMethod('isSupported'); return supported ?? false; } catch (_) { return false; } } Future claimScanner() async { if (!isAndroid) return; try { await _methodChannel.invokeMethod('claimScanner'); } catch (_) {} } Future releaseScanner() async { if (!isAndroid) return; try { await _methodChannel.invokeMethod('releaseScanner'); } catch (_) {} } Future consumePendingScan() async { if (!isAndroid) return null; try { final code = await _methodChannel.invokeMethod('consumePendingScan'); final trimmed = code?.trim(); if (trimmed == null || trimmed.isEmpty) return null; return trimmed; } catch (_) { return null; } } }