- - When I added notification of key events before processing them as text, it made it so that shortcut key bindings like the spacebar would prevent spaces from being inserted into text fields, which is obviously not desirable (and so that change was reverted). At the same time, we do want to make it possible to override key events so that they can do things like intercept a tab key or arrow keys that change the focus.
This PR changes the behavior of the Shortcuts widget so that if it has a shortcut defined, but no action is bound to the intent, then instead of responding that the key is "handled", it responds as if nothing handled it. This allows the engine to continue to process the key as text entry.
This PR includes:
- Modification of the callback type for key handlers to return a KeyEventResult instead of a bool, so that we can return more information (i.e. the extra state of "stop propagation").
- Modification of the ActionDispatcher.invokeAction contract to require that Action.isEnabled return true before calling it. It will now assert if the action isn't enabled when invokeAction is called. This is to allow optimization of the number of calls to isEnabled, since the shortcuts widget now wants to know if the action was enabled before deciding to either handle the key or to return ignored.
- Modification to ShortcutManager.handleKeypress to return KeyEventResult.ignored for keys which don't have an enabled action associated with them.
- Adds an attribute to DoNothingAction that allows it to mark a key as not handled, even though it does have an action associated with it. This will allow disabling of a shortcut for a subtree.
This converts the packages/flutter/test/services directory to NNBD, now that the services package is converted.
I changed the signature of checkMessageHandler and checkMockMessageHandler on BinaryMessenger to take a nullable handler, since the tests wanted to check to make sure a handler wasn't set, and that functionality no longer works if the handler is non-nullable.
This fixes a problem where the character field of the RawKeyEvent was not being set at all for non-Android platforms.
I also updated the key maps, and corrected a problem with the Windows key map where the backquote character wasn't correctly mapped.
This standardizes the handling of nullability for the LogicalKeyboardKey.keyLabel and RawKeyEventData.keyLabel accessors so that they are non-nullable, but can be empty.
Before this change, the keyLabel could be either null or an empty string to indicate that there wasn't a label, which makes it harder to test for, since both need to be checked for. Since an empty string is sufficient, there is no need for it to be nullable.
Also, in raw_keyboard.dart, the web and Windows implementations wouldn't accept null values for parameters in the Map coming from the message, but tests were supplying null for some of them. This makes web and Windows creation of events match the other platforms, and makes the migration of tests to non-nullability easier.
* Add native stacktrace field for PlatformException
* Mute the readValue check for stacktrace.
* polish
* Add unit test and further polish
* Added more comments
* remove unnecessary import
* fill in stacktrace to JSONMethodCodec and fix tests
* fix style
* Fix format
* Remove unnecessary TODO since not all explicitly declared errors have stacktrace in it from native side.
* Handle case for exception without stacktrace on jsonMethodCodec
* Add more unit tests
* format test
Co-authored-by: Ben Li <libe@google.com>
This makes the processing of RawKeyboardEventData.getModifierSide consistent among the platforms.
Before this change, some platforms (Android) didn't handle the case where the "either" flag was set, but no side flag was set (e.g. "shift" was set, but not "shift left"), and instead said that no keys were down by returning null (which was wrong).
Some platforms (Linux, Windows) also returned KeyboardSide.any from getModifierSide, when the contract says that it will never return KeyboardSide.any. Those methods now return KeyboardSide.all in the case where no side is specified, as macOS and Fuchsia already did.
Now, all platforms will return KeyboardSide.all from getModifierSide when it's not clear which side the key was on.
This adds an assert in RawKeyboard that catches the case where it tries to send a key down event, but (after synchronizing modifiers) there are no keys in keysPressed. This state can occur if the modifier flags are not set properly for the platform.
Also prevents shortcuts attempting to handle a key down when no keys are pressed at the moment (which was causing a crash in release mode).
* Add native stacktrace field for PlatformException
* Mute the readValue check for stacktrace.
* polish
* Add unit test and further polish
* Added more comments
* remove unnecessary import
* fill in stacktrace to JSONMethodCodec and fix tests
Co-authored-by: Ben Li <libe@google.com>