mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[web] Fix exception when using a keyboard (flutter/engine#24150)
This commit is contained in:
parent
51af2837d9
commit
bcbb6a1ce0
@ -194,10 +194,15 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
|
||||
/// Engine code should use this method instead of the callback directly.
|
||||
/// Otherwise zones won't work properly.
|
||||
void invokeOnKeyData(ui.KeyData data, _KeyDataResponseCallback callback) {
|
||||
invoke(
|
||||
() { callback(onKeyData == null ? false : onKeyData!(data)); },
|
||||
_onKeyDataZone,
|
||||
);
|
||||
final ui.KeyDataCallback? onKeyData = _onKeyData;
|
||||
if (onKeyData != null) {
|
||||
invoke(
|
||||
() => callback(onKeyData(data)),
|
||||
_onKeyDataZone,
|
||||
);
|
||||
} else {
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// A callback that is invoked to report the [FrameTiming] of recently
|
||||
|
||||
@ -13,6 +13,9 @@ import 'package:test/test.dart';
|
||||
import 'package:ui/ui.dart' as ui;
|
||||
import 'package:ui/src/engine.dart';
|
||||
|
||||
const int kPhysicalKeyA = 0x00070004;
|
||||
const int kLogicalKeyA = 0x00000000061;
|
||||
|
||||
void main() {
|
||||
internalBootstrapBrowserTest(() => testMain);
|
||||
}
|
||||
@ -146,6 +149,52 @@ void testMain() {
|
||||
EnginePlatformDispatcher.instance.invokeOnPointerDataPacket(null);
|
||||
});
|
||||
|
||||
test('invokeOnKeyData returns normally when onKeyData is null', () {
|
||||
final ui.KeyData keyData = ui.KeyData(
|
||||
timeStamp: Duration(milliseconds: 1),
|
||||
type: ui.KeyEventType.repeat,
|
||||
physical: kPhysicalKeyA,
|
||||
logical: kLogicalKeyA,
|
||||
character: 'a',
|
||||
synthesized: true,
|
||||
);
|
||||
expect(() {
|
||||
EnginePlatformDispatcher.instance.invokeOnKeyData(keyData, (bool result) {
|
||||
expect(result, isFalse);
|
||||
});
|
||||
}, returnsNormally);
|
||||
});
|
||||
|
||||
test('onKeyData preserves the zone', () {
|
||||
final Zone innerZone = Zone.current.fork();
|
||||
|
||||
innerZone.runGuarded(() {
|
||||
final ui.KeyDataCallback onKeyData = (_) {
|
||||
expect(Zone.current, innerZone);
|
||||
return false;
|
||||
};
|
||||
window.onKeyData = onKeyData;
|
||||
|
||||
// Test that the getter returns the exact same onKeyData, e.g. it doesn't
|
||||
// wrap it.
|
||||
expect(window.onKeyData, same(onKeyData));
|
||||
});
|
||||
|
||||
final ui.KeyData keyData = ui.KeyData(
|
||||
timeStamp: Duration(milliseconds: 1),
|
||||
type: ui.KeyEventType.repeat,
|
||||
physical: kPhysicalKeyA,
|
||||
logical: kLogicalKeyA,
|
||||
character: 'a',
|
||||
synthesized: true,
|
||||
);
|
||||
EnginePlatformDispatcher.instance.invokeOnKeyData(keyData, (bool result) {
|
||||
expect(result, isFalse);
|
||||
});
|
||||
|
||||
window.onKeyData = null;
|
||||
});
|
||||
|
||||
test('onSemanticsEnabledChanged preserves the zone', () {
|
||||
final Zone innerZone = Zone.current.fork();
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user