diff --git a/packages/flutter/lib/src/widgets/scroll_view.dart b/packages/flutter/lib/src/widgets/scroll_view.dart index 5d894ee93ae..9a43efc5319 100644 --- a/packages/flutter/lib/src/widgets/scroll_view.dart +++ b/packages/flutter/lib/src/widgets/scroll_view.dart @@ -596,6 +596,7 @@ class CustomScrollView extends ScrollView { this.slivers = const [], int? semanticChildCount, DragStartBehavior dragStartBehavior = DragStartBehavior.start, + ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual, String? restorationId, Clip clipBehavior = Clip.hardEdge, }) : super( @@ -611,6 +612,7 @@ class CustomScrollView extends ScrollView { cacheExtent: cacheExtent, semanticChildCount: semanticChildCount, dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, restorationId: restorationId, clipBehavior: clipBehavior, ); diff --git a/packages/flutter/test/widgets/scroll_view_test.dart b/packages/flutter/test/widgets/scroll_view_test.dart index 74410addd3a..4ea27cc1ce8 100644 --- a/packages/flutter/test/widgets/scroll_view_test.dart +++ b/packages/flutter/test/widgets/scroll_view_test.dart @@ -799,6 +799,45 @@ void main() { log.clear(); }); + testWidgets('CustomScrollView dismiss keyboard onDrag test', (WidgetTester tester) async { + final List focusNodes = List.generate(50, (int i) => FocusNode()); + + await tester.pumpWidget(textFieldBoilerplate( + child: CustomScrollView( + dragStartBehavior: DragStartBehavior.down, + keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, + slivers: [ + SliverList( + delegate: SliverChildListDelegate( + focusNodes.map((FocusNode focusNode) { + return Container( + height: 50, + color: Colors.green, + child: TextField( + focusNode: focusNode, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ) + ), + ); + }).toList(), + ), + ), + ], + ), + )); + + final Finder finder = find.byType(TextField).first; + final TextField textField = tester.widget(finder); + await tester.showKeyboard(finder); + expect(textField.focusNode.hasFocus, isTrue); + + await tester.drag(finder, const Offset(0.0, -40.0)); + await tester.pumpAndSettle(); + expect(textField.focusNode.hasFocus, isFalse); + }); + testWidgets('Can jumpTo during drag', (WidgetTester tester) async { final List log = []; final ScrollController controller = ScrollController();