@@ -14,12 +14,16 @@ final class ViewFocusBinding {
1414 static final ViewFocusBinding instance = ViewFocusBinding ._();
1515
1616 final List <ui.ViewFocusChangeCallback > _listeners = < ui.ViewFocusChangeCallback > [];
17+ int ? _lastViewId;
18+ ui.ViewFocusDirection _viewFocusDirection = ui.ViewFocusDirection .forward;
1719
1820 /// Subscribes the [listener] to [ui.ViewFocusEvent] events.
1921 void addListener (ui.ViewFocusChangeCallback listener) {
2022 if (_listeners.isEmpty) {
21- domDocument.body? .addEventListener (_focusin, _handleFocusin, true );
22- domDocument.body? .addEventListener (_focusout, _handleFocusout, true );
23+ domDocument.body? .addEventListener (_keyDown, _handleKeyDown);
24+ domDocument.body? .addEventListener (_keyUp, _handleKeyUp);
25+ domDocument.body? .addEventListener (_focusin, _handleFocusin);
26+ domDocument.body? .addEventListener (_focusout, _handleFocusout);
2327 }
2428 _listeners.add (listener);
2529 }
@@ -28,8 +32,10 @@ final class ViewFocusBinding {
2832 void removeListener (ui.ViewFocusChangeCallback listener) {
2933 _listeners.remove (listener);
3034 if (_listeners.isEmpty) {
31- domDocument.body? .removeEventListener (_focusin, _handleFocusin, true );
32- domDocument.body? .removeEventListener (_focusout, _handleFocusout, true );
35+ domDocument.body? .removeEventListener (_keyDown, _handleKeyDown);
36+ domDocument.body? .removeEventListener (_keyUp, _handleKeyUp);
37+ domDocument.body? .removeEventListener (_focusin, _handleFocusin);
38+ domDocument.body? .removeEventListener (_focusout, _handleFocusout);
3339 }
3440 }
3541
@@ -39,21 +45,32 @@ final class ViewFocusBinding {
3945 }
4046 }
4147
42- late final DomEventListener _handleFocusin = createDomEventListener (
43- (DomEvent event) => _handleFocusChange (event.target as DomElement ? ),
44- );
48+ late final DomEventListener _handleFocusin = createDomEventListener ((DomEvent event) {
49+ event as DomFocusEvent ;
50+ _handleFocusChange (event.target as DomElement ? );
51+ });
4552
46- late final DomEventListener _handleFocusout = createDomEventListener (
47- (DomEvent event) => _handleFocusChange ((event as DomFocusEvent ).relatedTarget as DomElement ? ),
48- );
53+ late final DomEventListener _handleFocusout = createDomEventListener ((DomEvent event) {
54+ event as DomFocusEvent ;
55+ _handleFocusChange (event.relatedTarget as DomElement ? );
56+ });
57+
58+ late final DomEventListener _handleKeyDown = createDomEventListener ((DomEvent event) {
59+ event as DomKeyboardEvent ;
60+ if (event.shiftKey) {
61+ _viewFocusDirection = ui.ViewFocusDirection .backward;
62+ }
63+ });
64+
65+ late final DomEventListener _handleKeyUp = createDomEventListener ((DomEvent event) {
66+ _viewFocusDirection = ui.ViewFocusDirection .forward;
67+ });
4968
50- int ? _lastViewId;
5169 void _handleFocusChange (DomElement ? focusedElement) {
5270 final int ? viewId = _viewId (focusedElement);
5371 if (viewId == _lastViewId) {
5472 return ;
5573 }
56-
5774 final ui.ViewFocusEvent event;
5875 if (viewId == null ) {
5976 event = ui.ViewFocusEvent (
@@ -65,7 +82,7 @@ final class ViewFocusBinding {
6582 event = ui.ViewFocusEvent (
6683 viewId: viewId,
6784 state: ui.ViewFocusState .focused,
68- direction: ui. ViewFocusDirection .forward ,
85+ direction: _viewFocusDirection ,
6986 );
7087 }
7188 _lastViewId = viewId;
@@ -84,4 +101,6 @@ final class ViewFocusBinding {
84101
85102 static const String _focusin = 'focusin' ;
86103 static const String _focusout = 'focusout' ;
104+ static const String _keyDown = 'keydown' ;
105+ static const String _keyUp = 'keyup' ;
87106}
0 commit comments