Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keyboard navigation for the Material Date Picker grid #59586

Merged

Conversation

darrenaustin
Copy link
Contributor

@darrenaustin darrenaustin commented Jun 16, 2020

Description

Added support for navigating the day grid in the Material Date Picker with just the keyboard. Normal Tab/Shift-Tab navigation can be used to bring focus to the date grid. Once inside the grid, the following keyboard shortcuts are supported:

Key Action
Tab move focus to next element outside grid
Shift-Tab move focus to previous element outside grid
Left Arrow move focus to previous day
Right Arrow move focus to next day
Up Arrow move focus to previous week
Down Arrow move focus to next week
Enter / Space select the currently focused day

Focus is only allowed on selectable days, and if the focus moves to a date not in the currently displayed month, the view will be scrolled to show the newly focused day.

DayGridKeyboard

Related Issues

#49809

Tests

I added two tests that verify selecting a date with just keyboard actions.

Checklist

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I signed the [CLA].
  • I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement].
  • I read the [Tree Hygiene] wiki page, which explains my responsibilities.
  • I updated/added relevant documentation (doc comments with ///).
  • All existing and new tests are passing.
  • The analyzer (flutter analyze --flutter-repo) does not report any problems on my PR.
  • I am willing to follow-up on review comments in a timely manner.

Breaking Change

Did any tests fail when you ran them?

  • No, no existing tests failed, so this is not a breaking change.

@fluttergithubbot fluttergithubbot added f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels. labels Jun 16, 2020
@darrenaustin darrenaustin force-pushed the date_picker_grid_navigation branch 2 times, most recently from 6bcf2f9 to 055ffbd Compare June 18, 2020 05:34
Copy link
Contributor

@HansMuller HansMuller left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@fluttergithubbot fluttergithubbot merged commit cc36608 into flutter:master Jun 23, 2020
@darrenaustin darrenaustin deleted the date_picker_grid_navigation branch June 23, 2020 00:10
@a14n
Copy link
Contributor

a14n commented Jun 23, 2020

Starting from this commit on master I constantly see the following test failures on my machine. (Perhaps related to my Europe/Paris timezone?)

$ flutter test --enable-experiment=non-nullable /home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart
00:08 +45: Keyboard navigation Can navigate date grid with arrow keys                                                                                                  
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Expected: DateTime:<2016-01-18 00:00:00.000>
  Actual: DateTime:<2016-01-17 00:00:00.000>

When the exception was thrown, this was the stack:
#4      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1236:9)
<asynchronous suspension>
#5      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#6      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#7      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#8      main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1205:30)
#9      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#10     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#11     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#14     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#15     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#16     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#21     withClock (package:clock/src/default.dart:46:10)
#22     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#27     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#28     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#29     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#30     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#31     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#36     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#37     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#42     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#43     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#44     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#49     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#50     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#51     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#58     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#59     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#60     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#65     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#66     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#84     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#85     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#119    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#127    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#128    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#138    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#147    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#148    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 108 frames from dart:async and package:stack_trace)

This was caught by the test expectation on the following line:
  file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart line 1236
The test description was:
  Can navigate date grid with arrow keys
════════════════════════════════════════════════════════════════════════════════════════════════════
00:08 +45 -1: Keyboard navigation Can navigate date grid with arrow keys [E]                                                                                           
  Test failed. See exception logs above.
  The test description was: Can navigate date grid with arrow keys
  
00:09 +45 -1: Keyboard navigation Navigating with arrow keys scrolls months                                                                                            
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Expected: exactly one matching node in the widget tree
  Actual: _TextFinder:<zero widgets with text "December 2015" (ignoring offstage widgets)>
   Which: means none were found but one was expected

When the exception was thrown, this was the stack:
#4      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1256:9)
<asynchronous suspension>
#5      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#6      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#7      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#8      main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1241:30)
#9      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#10     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#11     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#14     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#15     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#16     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#21     withClock (package:clock/src/default.dart:46:10)
#22     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#27     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#28     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#29     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#30     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#31     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#36     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#37     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#42     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#43     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#44     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#49     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#50     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#51     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#58     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#59     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#60     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#65     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#66     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#84     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#85     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#119    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#127    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#128    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#138    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#147    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#148    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 108 frames from dart:async and package:stack_trace)

This was caught by the test expectation on the following line:
  file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart line 1256
The test description was:
  Navigating with arrow keys scrolls months
════════════════════════════════════════════════════════════════════════════════════════════════════
00:09 +45 -2: Keyboard navigation Navigating with arrow keys scrolls months [E]                                                                                        
  Test failed. See exception logs above.
  The test description was: Navigating with arrow keys scrolls months
  
00:09 +45 -2: Keyboard navigation RTL text direction reverses the horizontal arrow key navigation                                                                      
══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
The following StateError was thrown during a platform message callback:
Bad state: No element

When the exception was thrown, this was the stack:
#0      ListMixin.lastWhere (dart:collection/list.dart:161:5)
#1      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:3791:40)
#2      Navigator.pop (package:flutter/src/widgets/navigator.dart:2074:27)
#3      _DatePickerDialogState._handleOk (package:flutter/src/material/pickers/date_picker_dialog.dart:311:15)
#4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#5      _InkResponseState._handleAction (package:flutter/src/material/ink_well.dart:763:5)
#6      CallbackAction.invoke (package:flutter/src/widgets/actions.dart:357:48)
#7      ActionDispatcher.invokeAction (package:flutter/src/widgets/actions.dart:390:23)
#8      Actions.invoke (package:flutter/src/widgets/actions.dart:627:67)
#9      ShortcutManager.handleKeypress (package:flutter/src/widgets/shortcuts.dart:330:15)
#10     _ShortcutsState._handleOnKey (package:flutter/src/widgets/shortcuts.dart:472:20)
#11     FocusManager._handleRawKeyEvent (package:flutter/src/widgets/focus_manager.dart:1623:43)
#12     RawKeyboard._handleKeyEvent (package:flutter/src/services/raw_keyboard.dart:542:17)
#13     BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
#14     BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:75:47)
#15     _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:267:33)
#16     TestDefaultBinaryMessenger.handlePlatformMessage (package:flutter_test/src/binding.dart:129:21)
#17     KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:514:61)
#18     KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:509:39)
#21     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#22     KeyEventSimulator.simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:509:27)
#23     simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:569:28)
#24     WidgetTester.sendKeyEvent (package:flutter_test/src/widget_tester.dart:930:11)
#25     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1307:22)
#36     FakeAsync.flushMicrotasks (package:fake_async/fake_async.dart:192:32)
#37     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1135:17)
#38     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1123:35)
(elided 27 frames from dart:async and package:stack_trace)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building Navigator-[GlobalObjectKey<NavigatorState>
_WidgetsAppState#6f2fb](dirty, dependencies: [HeroControllerScope], state:
NavigatorState#fe2ec(tickers: tracking 2 tickers)):
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4012 pos 12: '!_debugLocked':
is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack:
#2      NavigatorState.build (package:flutter/src/widgets/navigator.dart:4012:12)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546:15)
#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4719:11)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4262:5)
#7      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2667:33)
#8      AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1042:18)
#9      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
#10     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1115:15)
#11     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1054:9)
#12     AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:915:9)
#15     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#16     AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:902:27)
#17     WidgetTester.pumpAndSettle.<anonymous closure> (package:flutter_test/src/widget_tester.dart:563:23)
#20     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#21     WidgetTester.pumpAndSettle (package:flutter_test/src/widget_tester.dart:558:27)
#22     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1308:22)
<asynchronous suspension>
#23     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#24     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#25     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#26     main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#27     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#28     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#29     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#32     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#33     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#34     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#39     withClock (package:clock/src/default.dart:46:10)
#40     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#45     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#46     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#47     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#48     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#49     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#54     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#55     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#60     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#61     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#62     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#67     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#68     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#69     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#76     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#77     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#78     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#83     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#84     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#102    _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#103    new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#137    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#145    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#146    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#156    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#165    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#166    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 114 frames from class _AssertionError, dart:async, and package:stack_trace)

════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
The following assertion was thrown during a platform message callback:
'package:flutter/src/widgets/shortcuts.dart': Failed assertion: line 329 pos 15: 'primaryContext !=
null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack:
#2      ShortcutManager.handleKeypress (package:flutter/src/widgets/shortcuts.dart:329:15)
#3      _ShortcutsState._handleOnKey (package:flutter/src/widgets/shortcuts.dart:472:20)
#4      FocusManager._handleRawKeyEvent (package:flutter/src/widgets/focus_manager.dart:1623:43)
#5      RawKeyboard._handleKeyEvent (package:flutter/src/services/raw_keyboard.dart:542:17)
#6      BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
#7      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:267:33)
#8      TestDefaultBinaryMessenger.handlePlatformMessage (package:flutter_test/src/binding.dart:129:21)
#9      KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:514:61)
#12     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#13     KeyEventSimulator.simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:509:27)
#14     simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:569:28)
#15     WidgetTester.sendKeyEvent (package:flutter_test/src/widget_tester.dart:930:11)
#16     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1311:22)
<asynchronous suspension>
#17     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#18     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#19     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#20     main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#21     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#22     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#23     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#26     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#27     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#28     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#33     withClock (package:clock/src/default.dart:46:10)
#34     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#39     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#40     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#41     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#42     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#43     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#48     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#49     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#54     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#55     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#56     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#61     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#62     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#63     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#70     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#71     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#72     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#77     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#78     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#96     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#97     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#131    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#139    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#140    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#150    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#159    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#160    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 112 frames from class _AssertionError, dart:async, and package:stack_trace)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
The following assertion was thrown during a platform message callback:
'package:flutter/src/widgets/shortcuts.dart': Failed assertion: line 329 pos 15: 'primaryContext !=
null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack:
#2      ShortcutManager.handleKeypress (package:flutter/src/widgets/shortcuts.dart:329:15)
#3      _ShortcutsState._handleOnKey (package:flutter/src/widgets/shortcuts.dart:472:20)
#4      FocusManager._handleRawKeyEvent (package:flutter/src/widgets/focus_manager.dart:1623:43)
#5      RawKeyboard._handleKeyEvent (package:flutter/src/services/raw_keyboard.dart:542:17)
#6      BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
#7      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:267:33)
#8      TestDefaultBinaryMessenger.handlePlatformMessage (package:flutter_test/src/binding.dart:129:21)
#9      KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:514:61)
#12     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#13     KeyEventSimulator.simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:509:27)
#14     simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:569:28)
#15     WidgetTester.sendKeyEvent (package:flutter_test/src/widget_tester.dart:930:11)
#16     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1312:22)
<asynchronous suspension>
#17     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#18     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#19     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#20     main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#21     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#22     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#23     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#26     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#27     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#28     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#33     withClock (package:clock/src/default.dart:46:10)
#34     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#39     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#40     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#41     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#42     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#43     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#48     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#49     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#54     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#55     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#56     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#61     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#62     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#63     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#70     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#71     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#72     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#77     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#78     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#96     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#97     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#131    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#139    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#140    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#150    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#159    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#160    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 112 frames from class _AssertionError, dart:async, and package:stack_trace)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
The following assertion was thrown during a platform message callback:
'package:flutter/src/widgets/shortcuts.dart': Failed assertion: line 329 pos 15: 'primaryContext !=
null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack:
#2      ShortcutManager.handleKeypress (package:flutter/src/widgets/shortcuts.dart:329:15)
#3      _ShortcutsState._handleOnKey (package:flutter/src/widgets/shortcuts.dart:472:20)
#4      FocusManager._handleRawKeyEvent (package:flutter/src/widgets/focus_manager.dart:1623:43)
#5      RawKeyboard._handleKeyEvent (package:flutter/src/services/raw_keyboard.dart:542:17)
#6      BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
#7      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:267:33)
#8      TestDefaultBinaryMessenger.handlePlatformMessage (package:flutter_test/src/binding.dart:129:21)
#9      KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:514:61)
#12     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#13     KeyEventSimulator.simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:509:27)
#14     simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:569:28)
#15     WidgetTester.sendKeyEvent (package:flutter_test/src/widget_tester.dart:930:11)
#16     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1313:22)
<asynchronous suspension>
#17     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#18     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#19     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#20     main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#21     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#22     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#23     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#26     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#27     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#28     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#33     withClock (package:clock/src/default.dart:46:10)
#34     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#39     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#40     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#41     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#42     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#43     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#48     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#49     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#54     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#55     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#56     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#61     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#62     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#63     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#70     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#71     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#72     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#77     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#78     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#96     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#97     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#131    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#139    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#140    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#150    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#159    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#160    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 112 frames from class _AssertionError, dart:async, and package:stack_trace)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
The following assertion was thrown during a platform message callback:
'package:flutter/src/widgets/shortcuts.dart': Failed assertion: line 329 pos 15: 'primaryContext !=
null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack:
#2      ShortcutManager.handleKeypress (package:flutter/src/widgets/shortcuts.dart:329:15)
#3      _ShortcutsState._handleOnKey (package:flutter/src/widgets/shortcuts.dart:472:20)
#4      FocusManager._handleRawKeyEvent (package:flutter/src/widgets/focus_manager.dart:1623:43)
#5      RawKeyboard._handleKeyEvent (package:flutter/src/services/raw_keyboard.dart:542:17)
#6      BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
#7      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:267:33)
#8      TestDefaultBinaryMessenger.handlePlatformMessage (package:flutter_test/src/binding.dart:129:21)
#9      KeyEventSimulator.simulateKeyDownEvent.<anonymous closure> (package:flutter_test/src/event_simulation.dart:514:61)
#12     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#13     KeyEventSimulator.simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:509:27)
#14     simulateKeyDownEvent (package:flutter_test/src/event_simulation.dart:569:28)
#15     WidgetTester.sendKeyEvent (package:flutter_test/src/widget_tester.dart:930:11)
#16     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1317:22)
<asynchronous suspension>
#17     main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#18     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#19     main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#20     main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#21     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#22     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#23     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#26     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#27     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#28     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#33     withClock (package:clock/src/default.dart:46:10)
#34     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#39     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#40     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#41     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#42     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#43     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#48     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#49     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#54     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#55     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#56     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#61     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#62     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#63     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#70     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#71     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#72     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#77     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#78     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#96     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#97     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#131    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#139    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#140    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#150    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#159    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#160    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 112 frames from class _AssertionError, dart:async, and package:stack_trace)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Expected: DateTime:<2016-01-19 00:00:00.000>
  Actual: DateTime:<2016-01-15 00:00:00.000>

When the exception was thrown, this was the stack:
#4      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1321:9)
<asynchronous suspension>
#5      main.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#6      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:135:19)
<asynchronous suspension>
#7      main.prepareDatePicker (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#8      main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1289:30)
#9      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#10     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#11     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#14     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#15     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#16     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#21     withClock (package:clock/src/default.dart:46:10)
#22     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#27     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#28     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#29     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#30     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#31     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#36     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#37     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#42     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#43     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#44     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#49     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#50     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#51     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#58     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#59     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#60     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#65     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#66     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#84     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#85     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#119    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#127    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#128    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#138    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#147    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#148    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 108 frames from dart:async and package:stack_trace)

This was caught by the test expectation on the following line:
  file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart line 1321
The test description was:
  RTL text direction reverses the horizontal arrow key navigation
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following message was thrown:
Multiple exceptions (7) were detected during the running of the current test, and at least one was
unexpected.
════════════════════════════════════════════════════════════════════════════════════════════════════
00:09 +45 -3: Keyboard navigation RTL text direction reverses the horizontal arrow key navigation [E]                                                                  
  Test failed. See exception logs above.
  The test description was: RTL text direction reverses the horizontal arrow key navigation
  
00:09 +45 -3: Screen configurations common screen size - portrait                                                                                                      
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Expected: null
  Actual: _AssertionError:<'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2830
pos 12: '!_debugLocked': is not true.>

When the exception was thrown, this was the stack:
#4      main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart:1356:7)
<asynchronous suspension>
#5      main.<anonymous closure>.<anonymous closure> (file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart)
#6      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
#7      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#8      TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:739:19)
<asynchronous suspension>
#11     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:719:14)
#12     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1119:24)
#13     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#18     withClock (package:clock/src/default.dart:46:10)
#19     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#24     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#25     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1116:15)
#26     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:137:24)
#27     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:19)
<asynchronous suspension>
#28     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#33     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#34     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:235:15)
#39     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:232:5)
#40     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:388:17)
<asynchronous suspension>
#41     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart)
#46     Invoker._onRun.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:374:9)
#47     Invoker._guardIfGuarded (package:test_api/src/backend/invoker.dart:420:15)
#48     Invoker._onRun.<anonymous closure> (package:test_api/src/backend/invoker.dart:373:7)
#55     Invoker._onRun (package:test_api/src/backend/invoker.dart:372:11)
#56     LiveTestController.run (package:test_api/src/backend/live_test_controller.dart:152:11)
#57     RemoteListener._runLiveTest.<anonymous closure> (package:test_api/src/remote_listener.dart:259:16)
#62     RemoteListener._runLiveTest (package:test_api/src/remote_listener.dart:258:5)
#63     RemoteListener._serializeTest.<anonymous closure> (package:test_api/src/remote_listener.dart:211:7)
#81     _GuaranteeSink.add (package:stream_channel/src/guarantee_channel.dart:124:12)
#82     new _MultiChannel.<anonymous closure> (package:stream_channel/src/multi_channel.dart:159:31)
#116    new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1145:21)
#124    _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
#125    _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
#135    _Socket._onData (dart:io-patch/socket_patch.dart:2020:41)
#144    new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1556:33)
#145    _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1052:14)
(elided 108 frames from dart:async and package:stack_trace)

This was caught by the test expectation on the following line:
  file:///home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart line 1356
The test description was:
  common screen size - portrait
════════════════════════════════════════════════════════════════════════════════════════════════════
00:09 +45 -4: Screen configurations common screen size - portrait [E]                                                                                                  
  Test failed. See exception logs above.
  The test description was: common screen size - portrait

@HansMuller
Copy link
Contributor

@a14n - Thanks for the report, we'll look into the problem shortly.
CC @darrenaustin

@a14n
Copy link
Contributor

a14n commented Jun 26, 2020

@HansMuller did you manage to work on my problem (or create an issue)? I'm migrating framework to non-nullable and it would be great if I can have clean tests.

@HansMuller
Copy link
Contributor

@a14n - sorry about the delay. Unfortunately, flutter test --enable-experiment=non-nullable test/material/date_picker_test.dart doesn't fail for me however the test that's failing might have a subtle dependency on the time zone.

@darrenaustin - could you look into this?

@a14n
Copy link
Contributor

a14n commented Jun 26, 2020

I can reproduce/ignore the issue by using:

# no failure
TZ='America/Los_Angeles' flutter test --enable-experiment=non-nullable /home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart
# 3 failures
TZ='Europe/Paris' flutter test --enable-experiment=non-nullable /home/a14n/flutter/packages/flutter/test/material/date_picker_test.dart

@HansMuller
Copy link
Contributor

I can reproduce the failure as well:

(cd packages/flutter; export TZ='Europe/Paris'; flutter test --enable-experiment=non-nullable test/material/date_picker_test.dart)

@darrenaustin
Copy link
Contributor Author

Indeed that repros the case for me as well. I will look into why that causes that particular test to fail, but for the time being, I see if there is a way to hard code the timezone for that test.

@a14n I just filed an issue to track this: #60370

vasilich6107 added a commit to artflutter/whatsup_flutter_june2020 that referenced this pull request Jul 6, 2020
Keyboard navigation for the Material Date Picker grid
mingwandroid pushed a commit to mingwandroid/flutter that referenced this pull request Sep 6, 2020
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jul 30, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants