fix: RangeError when selecting text in SelectionArea (#162228)
fix: RangeError when selecting text in SelectionArea fixes #161931 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing.
This commit is contained in:
parent
17cb12d9bd
commit
211d83d772
@ -3027,7 +3027,7 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai
|
|||||||
if (event.forward) {
|
if (event.forward) {
|
||||||
currentSelectionStartIndex = currentSelectionEndIndex = 0;
|
currentSelectionStartIndex = currentSelectionEndIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
currentSelectionStartIndex = currentSelectionEndIndex = selectables.length;
|
currentSelectionStartIndex = currentSelectionEndIndex = selectables.length - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int targetIndex = event.isEnd ? currentSelectionEndIndex : currentSelectionStartIndex;
|
int targetIndex = event.isEnd ? currentSelectionEndIndex : currentSelectionStartIndex;
|
||||||
|
@ -4827,6 +4827,92 @@ void main() {
|
|||||||
expect(paragraph1.selections[0].end, 2);
|
expect(paragraph1.selections[0].end, 2);
|
||||||
}, variant: TargetPlatformVariant.all());
|
}, variant: TargetPlatformVariant.all());
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'should not throw range error when selecting previous paragraph',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: SelectableRegion(
|
||||||
|
selectionControls: materialTextSelectionControls,
|
||||||
|
child: const Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text('How are you?'),
|
||||||
|
Text('Good, and you?'),
|
||||||
|
Text('Fine, thank you.'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
// Select from offset 2 of paragraph3 to offset 6 of paragraph3.
|
||||||
|
final RenderParagraph paragraph3 = tester.renderObject<RenderParagraph>(
|
||||||
|
find.descendant(of: find.text('Fine, thank you.'), matching: find.byType(RichText)),
|
||||||
|
);
|
||||||
|
final TestGesture gesture = await tester.startGesture(
|
||||||
|
textOffsetToPosition(paragraph3, 2),
|
||||||
|
kind: PointerDeviceKind.mouse,
|
||||||
|
);
|
||||||
|
addTearDown(gesture.removePointer);
|
||||||
|
await tester.pump();
|
||||||
|
await gesture.moveTo(textOffsetToPosition(paragraph3, 6));
|
||||||
|
await gesture.up();
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
final bool alt;
|
||||||
|
final bool meta;
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
case TargetPlatform.fuchsia:
|
||||||
|
case TargetPlatform.linux:
|
||||||
|
case TargetPlatform.windows:
|
||||||
|
meta = false;
|
||||||
|
alt = true;
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
meta = true;
|
||||||
|
alt = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// How are you?
|
||||||
|
// Good, and you?
|
||||||
|
// Fi[ne, ]thank you.
|
||||||
|
expect(paragraph3.selections.length, 1);
|
||||||
|
expect(paragraph3.selections[0].start, 2);
|
||||||
|
expect(paragraph3.selections[0].end, 6);
|
||||||
|
|
||||||
|
await sendKeyCombination(
|
||||||
|
tester,
|
||||||
|
SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: alt, meta: meta),
|
||||||
|
);
|
||||||
|
await tester.pump();
|
||||||
|
// How are you?
|
||||||
|
// Good, and you?
|
||||||
|
// [Fine, ]thank you.
|
||||||
|
expect(paragraph3.selections.length, 1);
|
||||||
|
expect(paragraph3.selections[0].start, 0);
|
||||||
|
expect(paragraph3.selections[0].end, 6);
|
||||||
|
|
||||||
|
await sendKeyCombination(
|
||||||
|
tester,
|
||||||
|
const SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true),
|
||||||
|
);
|
||||||
|
await tester.pump();
|
||||||
|
// How are you?
|
||||||
|
// Good, and you[?
|
||||||
|
// Fine, ]thank you.
|
||||||
|
final RenderParagraph paragraph2 = tester.renderObject<RenderParagraph>(
|
||||||
|
find.descendant(of: find.text('Good, and you?'), matching: find.byType(RichText)),
|
||||||
|
);
|
||||||
|
expect(paragraph3.selections.length, 1);
|
||||||
|
expect(paragraph3.selections[0].start, 0);
|
||||||
|
expect(paragraph3.selections[0].end, 6);
|
||||||
|
expect(paragraph2.selections.length, 1);
|
||||||
|
expect(paragraph2.selections[0].start, 13);
|
||||||
|
expect(paragraph2.selections[0].end, 14);
|
||||||
|
},
|
||||||
|
variant: TargetPlatformVariant.all(),
|
||||||
|
);
|
||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'can use keyboard to granularly extend selection - document',
|
'can use keyboard to granularly extend selection - document',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user