mobile_scanner_method_channel.dart
2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:mobile_scanner/src/enums/camera_facing.dart';
import 'package:mobile_scanner/src/enums/torch_state.dart';
import 'package:mobile_scanner/src/mobile_scanner_platform_interface.dart';
/// An implementation of [MobileScannerPlatform] that uses method channels.
class MethodChannelMobileScanner extends MobileScannerPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel(
'dev.steenbakker.mobile_scanner/scanner/method',
);
/// The event channel that sends back scanned barcode events.
@visibleForTesting
final eventChannel = const EventChannel(
'dev.steenbakker.mobile_scanner/scanner/event',
);
Stream<Map<Object?, Object?>>? _eventsStream;
Stream<Map<Object?, Object?>> get eventsStream {
_eventsStream ??=
eventChannel.receiveBroadcastStream().cast<Map<Object?, Object?>>();
return _eventsStream!;
}
int? _textureId;
@override
Stream<TorchState> get torchStateStream {
return eventsStream
.where((event) => event['name'] == 'torchState')
.map((event) => TorchState.fromRawValue(event['data'] as int? ?? 0));
}
@override
Stream<double> get zoomScaleStateStream {
return eventsStream
.where((event) => event['name'] == 'zoomScaleState')
.map((event) => event['data'] as double? ?? 0.0);
}
@override
Future<bool> analyzeImage(String path) async {
final bool? result = await methodChannel.invokeMethod<bool>(
'analyzeImage',
path,
);
return result ?? false;
}
@override
Widget buildCameraView() => Texture(textureId: _textureId!);
@override
Future<void> resetZoomScale() async {
await methodChannel.invokeMethod<void>('resetScale');
}
@override
Future<void> setTorchState(TorchState torchState) async {
await methodChannel.invokeMethod<void>('torch', torchState.rawValue);
}
@override
Future<void> setZoomScale(double zoomScale) async {
await methodChannel.invokeMethod<void>('setScale', zoomScale);
}
@override
Future<void> start(CameraFacing cameraDirection) {}
@override
Future<void> stop() async {
await methodChannel.invokeMethod<void>('stop');
}
@override
Future<void> updateScanWindow(Rect? window) async {
await methodChannel.invokeMethod<void>(
'updateScanWindow',
{'rect': window},
);
}
@override
Future<void> dispose() async {
await stop();
}
}