Remove deprecated RenderEditable.onSelectionChanged (#98582)
This commit is contained in:
parent
574173bb80
commit
cb9e9a3786
@ -30,17 +30,6 @@ const EdgeInsets _kFloatingCaretSizeIncrease = EdgeInsets.symmetric(horizontal:
|
|||||||
// The corner radius of the floating cursor in pixels.
|
// The corner radius of the floating cursor in pixels.
|
||||||
const Radius _kFloatingCaretRadius = Radius.circular(1.0);
|
const Radius _kFloatingCaretRadius = Radius.circular(1.0);
|
||||||
|
|
||||||
/// Signature for the callback that reports when the user changes the selection
|
|
||||||
/// (including the cursor location).
|
|
||||||
///
|
|
||||||
/// Used by [RenderEditable.onSelectionChanged].
|
|
||||||
@Deprecated(
|
|
||||||
'Signature of a deprecated class method, '
|
|
||||||
'textSelectionDelegate.userUpdateTextEditingValue. '
|
|
||||||
'This feature was deprecated after v1.26.0-17.2.pre.',
|
|
||||||
)
|
|
||||||
typedef SelectionChangedHandler = void Function(TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause);
|
|
||||||
|
|
||||||
/// Signature for the callback that reports when the caret location changes.
|
/// Signature for the callback that reports when the caret location changes.
|
||||||
///
|
///
|
||||||
/// Used by [RenderEditable.onCaretChanged].
|
/// Used by [RenderEditable.onCaretChanged].
|
||||||
@ -265,11 +254,6 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
|
|||||||
double textScaleFactor = 1.0,
|
double textScaleFactor = 1.0,
|
||||||
TextSelection? selection,
|
TextSelection? selection,
|
||||||
required ViewportOffset offset,
|
required ViewportOffset offset,
|
||||||
@Deprecated(
|
|
||||||
'Uses the textSelectionDelegate.userUpdateTextEditingValue instead. '
|
|
||||||
'This feature was deprecated after v1.26.0-17.2.pre.',
|
|
||||||
)
|
|
||||||
this.onSelectionChanged,
|
|
||||||
this.onCaretChanged,
|
this.onCaretChanged,
|
||||||
this.ignorePointer = false,
|
this.ignorePointer = false,
|
||||||
bool readOnly = false,
|
bool readOnly = false,
|
||||||
@ -501,14 +485,6 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/// Called when the selection changes.
|
|
||||||
///
|
|
||||||
/// If this is null, then selection changes will be ignored.
|
|
||||||
@Deprecated(
|
|
||||||
'Uses the textSelectionDelegate.userUpdateTextEditingValue instead. '
|
|
||||||
'This feature was deprecated after v1.26.0-17.2.pre.',
|
|
||||||
)
|
|
||||||
SelectionChangedHandler? onSelectionChanged;
|
|
||||||
|
|
||||||
double? _textLayoutLastMaxWidth;
|
double? _textLayoutLastMaxWidth;
|
||||||
double? _textLayoutLastMinWidth;
|
double? _textLayoutLastMinWidth;
|
||||||
@ -731,7 +707,6 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _setTextEditingValue(TextEditingValue newValue, SelectionChangedCause cause) {
|
void _setTextEditingValue(TextEditingValue newValue, SelectionChangedCause cause) {
|
||||||
textSelectionDelegate.textEditingValue = newValue;
|
|
||||||
textSelectionDelegate.userUpdateTextEditingValue(newValue, cause);
|
textSelectionDelegate.userUpdateTextEditingValue(newValue, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,28 +726,12 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
|
|||||||
extentOffset: math.min(nextSelection.extentOffset, textLength),
|
extentOffset: math.min(nextSelection.extentOffset, textLength),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
_handleSelectionChange(nextSelection, cause);
|
|
||||||
_setTextEditingValue(
|
_setTextEditingValue(
|
||||||
textSelectionDelegate.textEditingValue.copyWith(selection: nextSelection),
|
textSelectionDelegate.textEditingValue.copyWith(selection: nextSelection),
|
||||||
cause,
|
cause,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleSelectionChange(
|
|
||||||
TextSelection nextSelection,
|
|
||||||
SelectionChangedCause cause,
|
|
||||||
) {
|
|
||||||
// Changes made by the keyboard can sometimes be "out of band" for listening
|
|
||||||
// components, so always send those events, even if we didn't think it
|
|
||||||
// changed. Also, focusing an empty field is sent as a selection change even
|
|
||||||
// if the selection offset didn't change.
|
|
||||||
final bool focusingEmpty = nextSelection.baseOffset == 0 && nextSelection.extentOffset == 0 && !hasFocus;
|
|
||||||
if (nextSelection == selection && cause != SelectionChangedCause.keyboard && !focusingEmpty) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSelectionChanged?.call(nextSelection, this, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void markNeedsPaint() {
|
void markNeedsPaint() {
|
||||||
super.markNeedsPaint();
|
super.markNeedsPaint();
|
||||||
|
@ -965,17 +965,6 @@ mixin TextSelectionDelegate {
|
|||||||
/// Gets the current text input.
|
/// Gets the current text input.
|
||||||
TextEditingValue get textEditingValue;
|
TextEditingValue get textEditingValue;
|
||||||
|
|
||||||
/// Indicates that the user has requested the delegate to replace its current
|
|
||||||
/// text editing state with [value].
|
|
||||||
///
|
|
||||||
/// The new [value] is treated as user input and thus may subject to input
|
|
||||||
/// formatting.
|
|
||||||
@Deprecated(
|
|
||||||
'Use the userUpdateTextEditingValue instead. '
|
|
||||||
'This feature was deprecated after v1.26.0-17.2.pre.',
|
|
||||||
)
|
|
||||||
set textEditingValue(TextEditingValue value) {}
|
|
||||||
|
|
||||||
/// Indicates that the user has requested the delegate to replace its current
|
/// Indicates that the user has requested the delegate to replace its current
|
||||||
/// text editing state with [value].
|
/// text editing state with [value].
|
||||||
///
|
///
|
||||||
|
@ -32,7 +32,6 @@ void main() {
|
|||||||
extentOffset: 3,
|
extentOffset: 3,
|
||||||
affinity: TextAffinity.upstream,
|
affinity: TextAffinity.upstream,
|
||||||
),
|
),
|
||||||
onSelectionChanged: (_, __, ___) { },
|
|
||||||
);
|
);
|
||||||
editable.layout(BoxConstraints.loose(const Size(1000.0, 1000.0)));
|
editable.layout(BoxConstraints.loose(const Size(1000.0, 1000.0)));
|
||||||
|
|
||||||
|
@ -27,11 +27,15 @@ class _FakeEditableTextState with TextSelectionDelegate {
|
|||||||
@override
|
@override
|
||||||
TextEditingValue textEditingValue = TextEditingValue.empty;
|
TextEditingValue textEditingValue = TextEditingValue.empty;
|
||||||
|
|
||||||
|
TextSelection? selection;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void hideToolbar([bool hideHandles = true]) { }
|
void hideToolbar([bool hideHandles = true]) { }
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) { }
|
void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) {
|
||||||
|
selection = value.selection;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bringIntoView(TextPosition position) { }
|
void bringIntoView(TextPosition position) { }
|
||||||
@ -471,10 +475,9 @@ void main() {
|
|||||||
|
|
||||||
test('selects correct place with offsets', () {
|
test('selects correct place with offsets', () {
|
||||||
const String text = 'test\ntest';
|
const String text = 'test\ntest';
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
final _FakeEditableTextState delegate = _FakeEditableTextState()
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
..textEditingValue = const TextEditingValue(text: text);
|
||||||
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
||||||
late TextSelection currentSelection;
|
|
||||||
final RenderEditable editable = RenderEditable(
|
final RenderEditable editable = RenderEditable(
|
||||||
backgroundCursorColor: Colors.grey,
|
backgroundCursorColor: Colors.grey,
|
||||||
selectionColor: Colors.black,
|
selectionColor: Colors.black,
|
||||||
@ -484,9 +487,6 @@ void main() {
|
|||||||
// This makes the scroll axis vertical.
|
// This makes the scroll axis vertical.
|
||||||
maxLines: 2,
|
maxLines: 2,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
currentSelection = selection;
|
|
||||||
},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -509,9 +509,8 @@ void main() {
|
|||||||
|
|
||||||
editable.selectPositionAt(from: const Offset(0, 2), cause: SelectionChangedCause.tap);
|
editable.selectPositionAt(from: const Offset(0, 2), cause: SelectionChangedCause.tap);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
|
expect(delegate.selection!.isCollapsed, true);
|
||||||
expect(currentSelection.isCollapsed, true);
|
expect(delegate.selection!.baseOffset, 0);
|
||||||
expect(currentSelection.baseOffset, 0);
|
|
||||||
|
|
||||||
viewportOffset.correctBy(10);
|
viewportOffset.correctBy(10);
|
||||||
|
|
||||||
@ -527,8 +526,8 @@ void main() {
|
|||||||
editable.selectPositionAt(from: const Offset(0, 2), cause: SelectionChangedCause.tap);
|
editable.selectPositionAt(from: const Offset(0, 2), cause: SelectionChangedCause.tap);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
|
|
||||||
expect(currentSelection.isCollapsed, true);
|
expect(delegate.selection!.isCollapsed, true);
|
||||||
expect(currentSelection.baseOffset, 5);
|
expect(delegate.selection!.baseOffset, 5);
|
||||||
|
|
||||||
// Test the other selection methods.
|
// Test the other selection methods.
|
||||||
// Move over by one character.
|
// Move over by one character.
|
||||||
@ -536,24 +535,24 @@ void main() {
|
|||||||
pumpFrame();
|
pumpFrame();
|
||||||
editable.selectPosition(cause:SelectionChangedCause.tap);
|
editable.selectPosition(cause:SelectionChangedCause.tap);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, true);
|
expect(delegate.selection!.isCollapsed, true);
|
||||||
expect(currentSelection.baseOffset, 6);
|
expect(delegate.selection!.baseOffset, 6);
|
||||||
|
|
||||||
editable.handleTapDown(TapDownDetails(globalPosition: const Offset(20, 2)));
|
editable.handleTapDown(TapDownDetails(globalPosition: const Offset(20, 2)));
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
editable.selectWord(cause:SelectionChangedCause.longPress);
|
editable.selectWord(cause:SelectionChangedCause.longPress);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, false);
|
expect(delegate.selection!.isCollapsed, false);
|
||||||
expect(currentSelection.baseOffset, 5);
|
expect(delegate.selection!.baseOffset, 5);
|
||||||
expect(currentSelection.extentOffset, 9);
|
expect(delegate.selection!.extentOffset, 9);
|
||||||
|
|
||||||
// Select one more character down but since it's still part of the same
|
// Select one more character down but since it's still part of the same
|
||||||
// word, the same word is selected.
|
// word, the same word is selected.
|
||||||
editable.selectWordsInRange(from: const Offset(30, 2), cause:SelectionChangedCause.longPress);
|
editable.selectWordsInRange(from: const Offset(30, 2), cause:SelectionChangedCause.longPress);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, false);
|
expect(delegate.selection!.isCollapsed, false);
|
||||||
expect(currentSelection.baseOffset, 5);
|
expect(delegate.selection!.baseOffset, 5);
|
||||||
expect(currentSelection.extentOffset, 9);
|
expect(delegate.selection!.extentOffset, 9);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('selects readonly renderEditable matches native behavior for android', () {
|
test('selects readonly renderEditable matches native behavior for android', () {
|
||||||
@ -561,10 +560,9 @@ void main() {
|
|||||||
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
||||||
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
||||||
const String text = ' test';
|
const String text = ' test';
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
final _FakeEditableTextState delegate = _FakeEditableTextState()
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
..textEditingValue = const TextEditingValue(text: text);
|
||||||
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
||||||
late TextSelection currentSelection;
|
|
||||||
final RenderEditable editable = RenderEditable(
|
final RenderEditable editable = RenderEditable(
|
||||||
backgroundCursorColor: Colors.grey,
|
backgroundCursorColor: Colors.grey,
|
||||||
selectionColor: Colors.black,
|
selectionColor: Colors.black,
|
||||||
@ -573,9 +571,6 @@ void main() {
|
|||||||
readOnly: true,
|
readOnly: true,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
currentSelection = selection;
|
|
||||||
},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -594,9 +589,9 @@ void main() {
|
|||||||
// Select the second white space, where the text position = 1.
|
// Select the second white space, where the text position = 1.
|
||||||
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, false);
|
expect(delegate.selection!.isCollapsed, false);
|
||||||
expect(currentSelection.baseOffset, 1);
|
expect(delegate.selection!.baseOffset, 1);
|
||||||
expect(currentSelection.extentOffset, 2);
|
expect(delegate.selection!.extentOffset, 2);
|
||||||
debugDefaultTargetPlatformOverride = previousPlatform;
|
debugDefaultTargetPlatformOverride = previousPlatform;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -605,10 +600,9 @@ void main() {
|
|||||||
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
||||||
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
|
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
|
||||||
const String text = ' test';
|
const String text = ' test';
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
final _FakeEditableTextState delegate = _FakeEditableTextState()
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
..textEditingValue = const TextEditingValue(text: text);
|
||||||
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
||||||
late TextSelection currentSelection;
|
|
||||||
final RenderEditable editable = RenderEditable(
|
final RenderEditable editable = RenderEditable(
|
||||||
backgroundCursorColor: Colors.grey,
|
backgroundCursorColor: Colors.grey,
|
||||||
selectionColor: Colors.black,
|
selectionColor: Colors.black,
|
||||||
@ -616,9 +610,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
currentSelection = selection;
|
|
||||||
},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -637,9 +628,9 @@ void main() {
|
|||||||
// Select the second white space, where the text position = 1.
|
// Select the second white space, where the text position = 1.
|
||||||
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, false);
|
expect(delegate.selection!.isCollapsed, false);
|
||||||
expect(currentSelection.baseOffset, 1);
|
expect(delegate.selection!.baseOffset, 1);
|
||||||
expect(currentSelection.extentOffset, 6);
|
expect(delegate.selection!.extentOffset, 6);
|
||||||
debugDefaultTargetPlatformOverride = previousPlatform;
|
debugDefaultTargetPlatformOverride = previousPlatform;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -648,10 +639,9 @@ void main() {
|
|||||||
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
final TargetPlatform? previousPlatform = debugDefaultTargetPlatformOverride;
|
||||||
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
|
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
|
||||||
const String text = ' ';
|
const String text = ' ';
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
final _FakeEditableTextState delegate = _FakeEditableTextState()
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
..textEditingValue = const TextEditingValue(text: text);
|
||||||
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
||||||
late TextSelection currentSelection;
|
|
||||||
final RenderEditable editable = RenderEditable(
|
final RenderEditable editable = RenderEditable(
|
||||||
backgroundCursorColor: Colors.grey,
|
backgroundCursorColor: Colors.grey,
|
||||||
selectionColor: Colors.black,
|
selectionColor: Colors.black,
|
||||||
@ -659,9 +649,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
currentSelection = selection;
|
|
||||||
},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -680,18 +667,17 @@ void main() {
|
|||||||
// Select the second white space, where the text position = 1.
|
// Select the second white space, where the text position = 1.
|
||||||
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
editable.selectWordsInRange(from: const Offset(10, 2), cause:SelectionChangedCause.longPress);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
expect(currentSelection.isCollapsed, true);
|
expect(delegate.selection!.isCollapsed, true);
|
||||||
expect(currentSelection.baseOffset, 1);
|
expect(delegate.selection!.baseOffset, 1);
|
||||||
expect(currentSelection.extentOffset, 1);
|
expect(delegate.selection!.extentOffset, 1);
|
||||||
debugDefaultTargetPlatformOverride = previousPlatform;
|
debugDefaultTargetPlatformOverride = previousPlatform;
|
||||||
});
|
});
|
||||||
|
|
||||||
test('selects correct place when offsets are flipped', () {
|
test('selects correct place when offsets are flipped', () {
|
||||||
const String text = 'abc def ghi';
|
const String text = 'abc def ghi';
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
final _FakeEditableTextState delegate = _FakeEditableTextState()
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
..textEditingValue = const TextEditingValue(text: text);
|
||||||
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
final ViewportOffset viewportOffset = ViewportOffset.zero();
|
||||||
late TextSelection currentSelection;
|
|
||||||
final RenderEditable editable = RenderEditable(
|
final RenderEditable editable = RenderEditable(
|
||||||
backgroundCursorColor: Colors.grey,
|
backgroundCursorColor: Colors.grey,
|
||||||
selectionColor: Colors.black,
|
selectionColor: Colors.black,
|
||||||
@ -699,9 +685,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
currentSelection = selection;
|
|
||||||
},
|
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
text: text,
|
text: text,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@ -716,71 +699,9 @@ void main() {
|
|||||||
|
|
||||||
editable.selectPositionAt(from: const Offset(30, 2), to: const Offset(10, 2), cause: SelectionChangedCause.drag);
|
editable.selectPositionAt(from: const Offset(30, 2), to: const Offset(10, 2), cause: SelectionChangedCause.drag);
|
||||||
pumpFrame();
|
pumpFrame();
|
||||||
|
expect(delegate.selection!.isCollapsed, isFalse);
|
||||||
expect(currentSelection.isCollapsed, isFalse);
|
expect(delegate.selection!.baseOffset, 3);
|
||||||
expect(currentSelection.baseOffset, 3);
|
expect(delegate.selection!.extentOffset, 1);
|
||||||
expect(currentSelection.extentOffset, 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('selection does not flicker as user is dragging', () {
|
|
||||||
int selectionChangedCount = 0;
|
|
||||||
TextSelection? updatedSelection;
|
|
||||||
const String text = 'abc def ghi';
|
|
||||||
final TextSelectionDelegate delegate = _FakeEditableTextState()
|
|
||||||
..textEditingValue = const TextEditingValue(text: text);
|
|
||||||
const TextSpan span = TextSpan(
|
|
||||||
text: text,
|
|
||||||
style: TextStyle(
|
|
||||||
height: 1.0, fontSize: 10.0, fontFamily: 'Ahem',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
final RenderEditable editable1 = RenderEditable(
|
|
||||||
textSelectionDelegate: delegate,
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
offset: ViewportOffset.zero(),
|
|
||||||
selection: const TextSelection(baseOffset: 3, extentOffset: 4),
|
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
selectionChangedCount++;
|
|
||||||
updatedSelection = selection;
|
|
||||||
},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
|
||||||
endHandleLayerLink: LayerLink(),
|
|
||||||
text: span,
|
|
||||||
);
|
|
||||||
|
|
||||||
layout(editable1);
|
|
||||||
|
|
||||||
// Shouldn't cause a selection change.
|
|
||||||
editable1.selectPositionAt(from: const Offset(30, 2), to: const Offset(42, 2), cause: SelectionChangedCause.drag);
|
|
||||||
pumpFrame();
|
|
||||||
|
|
||||||
expect(updatedSelection, isNull);
|
|
||||||
expect(selectionChangedCount, 0);
|
|
||||||
|
|
||||||
final RenderEditable editable2 = RenderEditable(
|
|
||||||
textSelectionDelegate: delegate,
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
offset: ViewportOffset.zero(),
|
|
||||||
selection: const TextSelection(baseOffset: 3, extentOffset: 4),
|
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {
|
|
||||||
selectionChangedCount++;
|
|
||||||
updatedSelection = selection;
|
|
||||||
},
|
|
||||||
text: span,
|
|
||||||
startHandleLayerLink: LayerLink(),
|
|
||||||
endHandleLayerLink: LayerLink(),
|
|
||||||
);
|
|
||||||
|
|
||||||
layout(editable2);
|
|
||||||
|
|
||||||
// Now this should cause a selection change.
|
|
||||||
editable2.selectPositionAt(from: const Offset(30, 2), to: const Offset(48, 2), cause: SelectionChangedCause.drag);
|
|
||||||
pumpFrame();
|
|
||||||
|
|
||||||
expect(updatedSelection!.baseOffset, 3);
|
|
||||||
expect(updatedSelection!.extentOffset, 5);
|
|
||||||
expect(selectionChangedCount, 1);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('promptRect disappears when promptRectColor is set to null', () {
|
test('promptRect disappears when promptRectColor is set to null', () {
|
||||||
@ -1318,7 +1239,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
@ -1361,7 +1281,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
@ -1406,7 +1325,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -1457,7 +1375,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -1515,7 +1432,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
@ -1574,7 +1490,6 @@ void main() {
|
|||||||
cursorColor: Colors.red,
|
cursorColor: Colors.red,
|
||||||
offset: viewportOffset,
|
offset: viewportOffset,
|
||||||
textSelectionDelegate: delegate,
|
textSelectionDelegate: delegate,
|
||||||
onSelectionChanged: (TextSelection selection, RenderEditable renderObject, SelectionChangedCause cause) {},
|
|
||||||
startHandleLayerLink: LayerLink(),
|
startHandleLayerLink: LayerLink(),
|
||||||
endHandleLayerLink: LayerLink(),
|
endHandleLayerLink: LayerLink(),
|
||||||
text: const TextSpan(
|
text: const TextSpan(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user