updateEditingValue method
Requests that this client update its editing state to the given value.
The new value is treated as user input and thus may subject to input
formatting.
Implementation
@protected
@override
void updateEditingValue(TextEditingValue value) {
if (readOnly) return;
_ensureImeProjection();
final currentText = _imeProjectionText;
final nextText = value.text;
if (currentText != nextText) {
int prefixLength = 0;
final maxPrefix = currentText.length < nextText.length
? currentText.length
: nextText.length;
while (prefixLength < maxPrefix &&
currentText.codeUnitAt(prefixLength) ==
nextText.codeUnitAt(prefixLength)) {
prefixLength++;
}
int suffixLength = 0;
final currentTail = currentText.length - prefixLength;
final nextTail = nextText.length - prefixLength;
while (suffixLength < currentTail &&
suffixLength < nextTail &&
currentText.codeUnitAt(currentText.length - suffixLength - 1) ==
nextText.codeUnitAt(nextText.length - suffixLength - 1)) {
suffixLength++;
}
final replaceStart = _imeProjectionStartOffset + prefixLength;
final replaceEnd =
_imeProjectionStartOffset + currentText.length - suffixLength;
final replacement = nextText.substring(
prefixLength,
nextText.length - suffixLength,
);
replaceRange(replaceStart, replaceEnd, replacement);
}
_selection = _localImeSelectionToGlobal(value.selection);
_imeProjectionDirty = true;
dirtyRegion = TextRange(start: 0, end: _rope.length);
dirtyLine = null;
notifyListeners();
}