/
key_event.dart
56 lines (43 loc) · 1.58 KB
/
key_event.dart
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
import 'dart:async';
import 'dart:developer' as developer;
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:flutter/services.dart';
part 'key_event.g.dart';
class KeyCode extends EnumClass {
const KeyCode._(String name) : super(name);
static const KeyCode volumeDown = _$volumeDown;
static const KeyCode volumeUp = _$volumeUp;
static BuiltSet<KeyCode> get values => _$keyCodeValues;
static KeyCode valueOf(String name) => _$keyCodeValueOf(name);
}
typedef KeyEventCallback = Function(KeyCode);
class KeyEventListener {
static const _methodChannel = MethodChannel('app.ehredux/method');
static const _keyDownEventChannel = EventChannel('app.ehredux/event/keyDown');
Function listen(List<KeyCode> keys, KeyEventCallback callback) {
_interceptKeyDown(keys);
final sub = _keyDownEventChannel.receiveBroadcastStream().listen((event) {
final code = KeyCode.valueOf(event as String);
if (code != null && keys.contains(code)) {
callback(code);
}
});
return () {
_uninterceptKeyDown(keys);
sub.cancel();
};
}
Future<void> _interceptKeyDown(List<KeyCode> keys) async {
for (final key in keys) {
await _methodChannel.invokeMethod('interceptKeyDown', key.toString());
developer.log('Intercept key down: $key');
}
}
Future<void> _uninterceptKeyDown(List<KeyCode> keys) async {
for (final key in keys) {
await _methodChannel.invokeMethod('uninterceptKeyDown', key.toString());
developer.log('Unintercept key down: $key');
}
}
}