updateEditingValue method

  1. @protected
  2. @override
void updateEditingValue(
  1. TextEditingValue value
)
override

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();
}