Space and arrow keys in a text field shouldn't scroll (#74454)
This commit is contained in:
parent
177fd261bb
commit
e204eb2fca
@ -1201,7 +1201,9 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with Restoratio
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
return Semantics(
|
return Shortcuts(
|
||||||
|
shortcuts: scrollShortcutOverrides,
|
||||||
|
child: Semantics(
|
||||||
enabled: enabled,
|
enabled: enabled,
|
||||||
onTap: !enabled || widget.readOnly ? null : () {
|
onTap: !enabled || widget.readOnly ? null : () {
|
||||||
if (!controller.selection.isValid) {
|
if (!controller.selection.isValid) {
|
||||||
@ -1224,6 +1226,7 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with Restoratio
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1290,7 +1290,9 @@ class _TextFieldState extends State<TextField> with RestorationMixin implements
|
|||||||
semanticsMaxValueLength = null;
|
semanticsMaxValueLength = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return MouseRegion(
|
return Shortcuts(
|
||||||
|
shortcuts: scrollShortcutOverrides,
|
||||||
|
child: MouseRegion(
|
||||||
cursor: effectiveMouseCursor,
|
cursor: effectiveMouseCursor,
|
||||||
onEnter: (PointerEnterEvent event) => _handleHover(true),
|
onEnter: (PointerEnterEvent event) => _handleHover(true),
|
||||||
onExit: (PointerExitEvent event) => _handleHover(false),
|
onExit: (PointerExitEvent event) => _handleHover(false),
|
||||||
@ -1316,6 +1318,7 @@ class _TextFieldState extends State<TextField> with RestorationMixin implements
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import 'package:flutter/rendering.dart';
|
|||||||
import 'package:flutter/scheduler.dart';
|
import 'package:flutter/scheduler.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
import 'actions.dart';
|
||||||
import 'autofill.dart';
|
import 'autofill.dart';
|
||||||
import 'automatic_keep_alive.dart';
|
import 'automatic_keep_alive.dart';
|
||||||
import 'basic.dart';
|
import 'basic.dart';
|
||||||
@ -26,6 +27,7 @@ import 'media_query.dart';
|
|||||||
import 'scroll_controller.dart';
|
import 'scroll_controller.dart';
|
||||||
import 'scroll_physics.dart';
|
import 'scroll_physics.dart';
|
||||||
import 'scrollable.dart';
|
import 'scrollable.dart';
|
||||||
|
import 'shortcuts.dart';
|
||||||
import 'text.dart';
|
import 'text.dart';
|
||||||
import 'text_selection.dart';
|
import 'text_selection.dart';
|
||||||
import 'ticker_provider.dart';
|
import 'ticker_provider.dart';
|
||||||
@ -53,6 +55,19 @@ const Duration _kCursorBlinkWaitForStart = Duration(milliseconds: 150);
|
|||||||
// is shown in an obscured text field.
|
// is shown in an obscured text field.
|
||||||
const int _kObscureShowLatestCharCursorTicks = 3;
|
const int _kObscureShowLatestCharCursorTicks = 3;
|
||||||
|
|
||||||
|
/// A map used to disable scrolling shortcuts in text fields.
|
||||||
|
///
|
||||||
|
/// This is a temporary fix for: https://github.com/flutter/flutter/issues/74191
|
||||||
|
final Map<LogicalKeySet, Intent> scrollShortcutOverrides = kIsWeb
|
||||||
|
? <LogicalKeySet, Intent>{
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.space): DoNothingAndStopPropagationIntent(),
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.arrowUp): DoNothingAndStopPropagationIntent(),
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.arrowDown): DoNothingAndStopPropagationIntent(),
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.arrowLeft): DoNothingAndStopPropagationIntent(),
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.arrowRight): DoNothingAndStopPropagationIntent(),
|
||||||
|
}
|
||||||
|
: <LogicalKeySet, Intent>{};
|
||||||
|
|
||||||
/// A controller for an editable text field.
|
/// A controller for an editable text field.
|
||||||
///
|
///
|
||||||
/// Whenever the user modifies a text field with an associated
|
/// Whenever the user modifies a text field with an associated
|
||||||
|
@ -4287,6 +4287,39 @@ void main() {
|
|||||||
expect(focusNode3.hasPrimaryFocus, isTrue);
|
expect(focusNode3.hasPrimaryFocus, isTrue);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Scrolling shortcuts are disabled in text fields', (WidgetTester tester) async {
|
||||||
|
bool scrollInvoked = false;
|
||||||
|
await tester.pumpWidget(
|
||||||
|
CupertinoApp(
|
||||||
|
home: Actions(
|
||||||
|
actions: <Type, Action<Intent>>{
|
||||||
|
ScrollIntent: CallbackAction<ScrollIntent>(onInvoke: (Intent intent) {
|
||||||
|
scrollInvoked = true;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
child: ListView(
|
||||||
|
children: const <Widget>[
|
||||||
|
Padding(padding: EdgeInsets.symmetric(vertical: 200)),
|
||||||
|
CupertinoTextField(),
|
||||||
|
Padding(padding: EdgeInsets.symmetric(vertical: 800)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.pump();
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
|
||||||
|
// Set focus on the text field.
|
||||||
|
await tester.tapAt(tester.getTopLeft(find.byType(CupertinoTextField)));
|
||||||
|
|
||||||
|
await tester.sendKeyEvent(LogicalKeyboardKey.space);
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
|
||||||
|
await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown);
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
});
|
||||||
|
|
||||||
testWidgets('Cupertino text field semantics', (WidgetTester tester) async {
|
testWidgets('Cupertino text field semantics', (WidgetTester tester) async {
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
CupertinoApp(
|
CupertinoApp(
|
||||||
|
@ -8754,6 +8754,41 @@ void main() {
|
|||||||
expect(focusNode3.hasPrimaryFocus, isTrue);
|
expect(focusNode3.hasPrimaryFocus, isTrue);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Scrolling shortcuts are disabled in text fields', (WidgetTester tester) async {
|
||||||
|
bool scrollInvoked = false;
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Actions(
|
||||||
|
actions: <Type, Action<Intent>>{
|
||||||
|
ScrollIntent: CallbackAction<ScrollIntent>(onInvoke: (Intent intent) {
|
||||||
|
scrollInvoked = true;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
child: Material(
|
||||||
|
child: ListView(
|
||||||
|
children: const <Widget>[
|
||||||
|
Padding(padding: EdgeInsets.symmetric(vertical: 200)),
|
||||||
|
TextField(),
|
||||||
|
Padding(padding: EdgeInsets.symmetric(vertical: 800)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.pump();
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
|
||||||
|
// Set focus on the text field.
|
||||||
|
await tester.tapAt(tester.getTopLeft(find.byType(TextField)));
|
||||||
|
|
||||||
|
await tester.sendKeyEvent(LogicalKeyboardKey.space);
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
|
||||||
|
await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown);
|
||||||
|
expect(scrollInvoked, isFalse);
|
||||||
|
});
|
||||||
|
|
||||||
testWidgets("A buildCounter that returns null doesn't affect the size of the TextField", (WidgetTester tester) async {
|
testWidgets("A buildCounter that returns null doesn't affect the size of the TextField", (WidgetTester tester) async {
|
||||||
// Regression test for https://github.com/flutter/flutter/issues/44909
|
// Regression test for https://github.com/flutter/flutter/issues/44909
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user