replaced method Null safety
Returns a new TextEditingValue, which is this TextEditingValue with
its text partially replaced by the replacementString
.
The replacementRange
parameter specifies the range of the
TextEditingValue.text that needs to be replaced.
The replacementString
parameter specifies the string to replace the
given range of text with.
This method also adjusts the selection range and the composing range of the resulting TextEditingValue, such that they point to the same substrings as the correspoinding ranges in the original TextEditingValue. For example, if the original TextEditingValue is "Hello world" with the word "world" selected, replacing "Hello" with a different string using this method will not change the selected word.
This method does nothing if the given replacementRange
is not
TextRange.isValid.
Implementation
TextEditingValue replaced(TextRange replacementRange, String replacementString) {
if (!replacementRange.isValid) {
return this;
}
final String newText = text.replaceRange(replacementRange.start, replacementRange.end, replacementString);
if (replacementRange.end - replacementRange.start == replacementString.length) {
return copyWith(text: newText);
}
int adjustIndex(int originalIndex) {
// The length added by adding the replacementString.
final int replacedLength = originalIndex <= replacementRange.start && originalIndex < replacementRange.end ? 0 : replacementString.length;
// The length removed by removing the replacementRange.
final int removedLength = originalIndex.clamp(replacementRange.start, replacementRange.end) - replacementRange.start; // ignore_clamp_double_lint
return originalIndex + replacedLength - removedLength;
}
final TextSelection adjustedSelection = TextSelection(
baseOffset: adjustIndex(selection.baseOffset),
extentOffset: adjustIndex(selection.extentOffset),
);
final TextRange adjustedComposing = TextRange(
start: adjustIndex(composing.start),
end: adjustIndex(composing.end),
);
assert(_textRangeIsValid(adjustedSelection, newText));
assert(_textRangeIsValid(adjustedComposing, newText));
return TextEditingValue(
text: newText,
selection: adjustedSelection,
composing: adjustedComposing,
);
}