-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
scroll_keyboard_shortcut.dart
81 lines (72 loc) · 2.7 KB
/
scroll_keyboard_shortcut.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
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
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mono_kit/mono_kit.dart';
import 'package:mono_kit/utils/logger.dart';
class ScrollKeyboardShortcut extends StatefulWidget {
const ScrollKeyboardShortcut({
Key key,
@required this.scrollController,
@required this.child,
this.stepOffset = 44,
}) : super(key: key);
final Widget child;
final PagingScrollController scrollController;
final double stepOffset;
@override
_ScrollKeyboardShortcutState createState() => _ScrollKeyboardShortcutState();
}
class _ScrollKeyboardShortcutState extends State<ScrollKeyboardShortcut> {
final _focusNode = FocusNode();
@override
void dispose() {
_focusNode.dispose();
super.dispose();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (ModalRoute.of(context).isCurrent) {
FocusScope.of(context).requestFocus(_focusNode);
}
}
@override
Widget build(BuildContext context) {
return Shortcuts(
shortcuts: _disabledNavigationKeys,
child: RawKeyboardListener(
focusNode: _focusNode,
onKey: (event) {
if (event.runtimeType == RawKeyDownEvent) {
final logicalKey = event.logicalKey;
logger.fine('keyId: $logicalKey');
if (logicalKey == LogicalKeyboardKey.arrowUp) {
widget.scrollController.scrollUp(offset: widget.stepOffset);
} else if (logicalKey == LogicalKeyboardKey.arrowDown) {
widget.scrollController.scrollDown(offset: widget.stepOffset);
} else if (logicalKey == LogicalKeyboardKey.pageUp) {
widget.scrollController.scrollToPreviousPage();
} else if (logicalKey == LogicalKeyboardKey.pageDown) {
widget.scrollController.scrollToNextPage();
} else if (logicalKey == LogicalKeyboardKey.home) {
widget.scrollController.scrollToTop();
} else if (logicalKey == LogicalKeyboardKey.end) {
widget.scrollController.scrollToBottom();
} else if (logicalKey == LogicalKeyboardKey.space) {
event.isShiftPressed
? widget.scrollController.scrollToPreviousPage()
: widget.scrollController.scrollToNextPage();
}
}
},
child: widget.child,
),
);
}
final Map<LogicalKeySet, Intent> _disabledNavigationKeys =
<LogicalKeySet, Intent>{
LogicalKeySet(LogicalKeyboardKey.arrowUp): Intent.doNothing,
LogicalKeySet(LogicalKeyboardKey.arrowDown): Intent.doNothing,
LogicalKeySet(LogicalKeyboardKey.arrowLeft): Intent.doNothing,
LogicalKeySet(LogicalKeyboardKey.arrowRight): Intent.doNothing,
};
}