diff --git a/lib/src/editor/raw_editor/raw_editor_state.dart b/lib/src/editor/raw_editor/raw_editor_state.dart index cdc9793e5..63bb8153d 100644 --- a/lib/src/editor/raw_editor/raw_editor_state.dart +++ b/lib/src/editor/raw_editor/raw_editor_state.dart @@ -1135,7 +1135,11 @@ class QuillRawEditorState extends EditorState void _updateOrDisposeSelectionOverlayIfNeeded() { if (_selectionOverlay != null) { - if (!_hasFocus || textEditingValue.selection.isCollapsed) { + if (!_hasFocus) { + _selectionOverlay!.dispose(); + _selectionOverlay = null; + } else if (textEditingValue.selection.isCollapsed && _selectionOverlay!.toolbar == null) { + // Only dispose the selection overlay when selection is collapsed and no toolbar is shown _selectionOverlay!.dispose(); _selectionOverlay = null; } else { diff --git a/test/double_tap_toolbar_test.dart b/test/double_tap_toolbar_test.dart new file mode 100644 index 000000000..9ffd16ab4 --- /dev/null +++ b/test/double_tap_toolbar_test.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:flutter_quill/quill_delta.dart'; +import 'package:flutter/material.dart' show MaterialTextSelectionToolbar; +import 'package:flutter/cupertino.dart' show CupertinoTextSelectionToolbar; + +void main() { + group('Double Tap Toolbar Test', () { + late QuillController controller; + + setUp(() { + controller = QuillController.basic(); + }); + + tearDown(() { + controller.dispose(); + }); + + testWidgets('should show toolbar on double tap', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: QuillEditor.basic( + controller: controller, + config: const QuillEditorConfig(), + ), + ), + ), + ); + + // Add some text to the editor + controller.document = Document.fromDelta( + Delta()..insert('Hello World\n'), + ); + await tester.pumpAndSettle(); + + // Double tap on the text + await tester.tap(find.byType(QuillEditor)); + await tester.pump(const Duration(milliseconds: 50)); + await tester.tap(find.byType(QuillEditor)); + await tester.pumpAndSettle(); + + // Check for any known toolbar widget by type name + final toolbarTypeNames = [ + 'AdaptiveTextSelectionToolbar', + 'MaterialTextSelectionToolbar', + 'CupertinoTextSelectionToolbar', + ]; + final foundToolbar = tester.allWidgets.any( + (widget) => toolbarTypeNames.contains(widget.runtimeType.toString()), + ); + expect(foundToolbar, isTrue, reason: 'Toolbar should be shown on double tap'); + }); + }); +} \ No newline at end of file