diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index c8067f91d3512..1f722228e7e44 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -3312,6 +3312,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien } TextSelectionOverlay _createSelectionOverlay() { + final EditableTextContextMenuBuilder? contextMenuBuilder = widget.contextMenuBuilder; final TextSelectionOverlay selectionOverlay = TextSelectionOverlay( clipboardStatus: clipboardStatus, context: context, @@ -3325,10 +3326,10 @@ class EditableTextState extends State with AutomaticKeepAliveClien selectionDelegate: this, dragStartBehavior: widget.dragStartBehavior, onSelectionHandleTapped: widget.onSelectionHandleTapped, - contextMenuBuilder: widget.contextMenuBuilder == null + contextMenuBuilder: contextMenuBuilder == null ? null : (BuildContext context) { - return widget.contextMenuBuilder!( + return contextMenuBuilder( context, this, ); diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 3aabe0f4e9f82..af2f20db2a352 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -15661,6 +15661,49 @@ void main() { }, skip: kIsWeb, // [intended] on web the browser handles the context menu. ); + + testWidgets('contextMenuBuilder changes from default to null', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + final TextEditingController controller = TextEditingController(text: ''); + await tester.pumpWidget(MaterialApp(home: Material(child: TextField(key: key, controller: controller)))); + + await tester.pump(); // Wait for autofocus to take effect. + + // Long-press to bring up the context menu. + final Finder textFinder = find.byType(EditableText); + await tester.longPress(textFinder); + tester.state(textFinder).showToolbar(); + await tester.pump(); + + expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget); + + // Set contextMenuBuilder to null. + await tester.pumpWidget( + MaterialApp( + home: Material( + child: TextField( + key: key, + controller: controller, + contextMenuBuilder: null, + ), + ), + ), + ); + + // Trigger build one more time... + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Padding( + padding: EdgeInsets.zero, + child: TextField(key: key, controller: controller, contextMenuBuilder: null), + ), + ), + ), + ); + }, + skip: kIsWeb, // [intended] on web the browser handles the context menu. + ); }); group('magnifier builder', () {