Skip to content

Commit 046d907

Browse files
authored
Fix TextSelectionGestureDetectorBuilder wrong cause for onDoubleTapDown (#121093)
Co-authored-by: Bruno Leroux <[email protected]>
1 parent 114d93f commit 046d907

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

packages/flutter/lib/src/widgets/text_selection.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2430,7 +2430,7 @@ class TextSelectionGestureDetectorBuilder {
24302430
@protected
24312431
void onDoubleTapDown(TapDragDownDetails details) {
24322432
if (delegate.selectionEnabled) {
2433-
renderEditable.selectWord(cause: SelectionChangedCause.tap);
2433+
renderEditable.selectWord(cause: SelectionChangedCause.doubleTap);
24342434
if (shouldShowSelectionToolbar) {
24352435
editableText.showToolbar();
24362436
}

packages/flutter/test/widgets/text_selection_test.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ void main() {
461461
final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable));
462462
expect(state.showToolbarCalled, isTrue);
463463
expect(renderEditable.selectPositionAtCalled, isTrue);
464+
expect(renderEditable.lastCause, SelectionChangedCause.longPress);
464465
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
465466

466467
testWidgets('test TextSelectionGestureDetectorBuilder long press on non-Apple Platforms', (WidgetTester tester) async {
@@ -477,6 +478,7 @@ void main() {
477478
final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable));
478479
expect(state.showToolbarCalled, isTrue);
479480
expect(renderEditable.selectWordCalled, isTrue);
481+
expect(renderEditable.lastCause, SelectionChangedCause.longPress);
480482
}, variant: TargetPlatformVariant.all(excluding: <TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
481483

482484
testWidgets('TextSelectionGestureDetectorBuilder right click Apple platforms', (WidgetTester tester) async {
@@ -503,6 +505,7 @@ void main() {
503505
await gesture.up();
504506
await tester.pump();
505507
expect(renderEditable.selectWordCalled, isTrue);
508+
expect(renderEditable.lastCause, SelectionChangedCause.tap);
506509

507510
// Right clicking on a word within a selection shouldn't change the selection
508511
renderEditable.selectWordCalled = false;
@@ -589,13 +592,15 @@ void main() {
589592
switch (defaultTargetPlatform) {
590593
case TargetPlatform.iOS:
591594
expect(renderEditable.selectWordEdgeCalled, isTrue);
595+
expect(renderEditable.lastCause, SelectionChangedCause.tap);
592596
break;
593597
case TargetPlatform.macOS:
594598
case TargetPlatform.android:
595599
case TargetPlatform.fuchsia:
596600
case TargetPlatform.linux:
597601
case TargetPlatform.windows:
598602
expect(renderEditable.selectPositionAtCalled, isTrue);
603+
expect(renderEditable.lastCause, SelectionChangedCause.tap);
599604
break;
600605
}
601606
}, variant: TargetPlatformVariant.all());
@@ -628,6 +633,7 @@ void main() {
628633
case TargetPlatform.linux:
629634
case TargetPlatform.windows:
630635
expect(renderEditable.selectPositionAtCalled, isTrue);
636+
expect(renderEditable.lastCause, SelectionChangedCause.tap);
631637
break;
632638
}
633639
}, variant: TargetPlatformVariant.all());
@@ -670,6 +676,7 @@ void main() {
670676
final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable));
671677
expect(state.showToolbarCalled, isTrue);
672678
expect(renderEditable.selectWordCalled, isTrue);
679+
expect(renderEditable.lastCause, SelectionChangedCause.doubleTap);
673680
});
674681

675682
testWidgets('test TextSelectionGestureDetectorBuilder forcePress enabled', (WidgetTester tester) async {
@@ -1671,18 +1678,22 @@ class FakeRenderEditable extends RenderEditable {
16711678
),
16721679
);
16731680

1681+
SelectionChangedCause? lastCause;
1682+
16741683
bool selectWordsInRangeCalled = false;
16751684
@override
16761685
void selectWordsInRange({ required Offset from, Offset? to, required SelectionChangedCause cause }) {
16771686
selectWordsInRangeCalled = true;
16781687
hasFocus = true;
1688+
lastCause = cause;
16791689
}
16801690

16811691
bool selectWordEdgeCalled = false;
16821692
@override
16831693
void selectWordEdge({ required SelectionChangedCause cause }) {
16841694
selectWordEdgeCalled = true;
16851695
hasFocus = true;
1696+
lastCause = cause;
16861697
}
16871698

16881699
bool selectPositionAtCalled = false;
@@ -1694,12 +1705,14 @@ class FakeRenderEditable extends RenderEditable {
16941705
selectPositionAtFrom = from;
16951706
selectPositionAtTo = to;
16961707
hasFocus = true;
1708+
lastCause = cause;
16971709
}
16981710

16991711
bool selectPositionCalled = false;
17001712
@override
17011713
void selectPosition({ required SelectionChangedCause cause }) {
17021714
selectPositionCalled = true;
1715+
lastCause = cause;
17031716
return super.selectPosition(cause: cause);
17041717
}
17051718

@@ -1708,6 +1721,7 @@ class FakeRenderEditable extends RenderEditable {
17081721
void selectWord({ required SelectionChangedCause cause }) {
17091722
selectWordCalled = true;
17101723
hasFocus = true;
1724+
lastCause = cause;
17111725
}
17121726

17131727
@override

0 commit comments

Comments
 (0)