correctCaretOffset static method

TextEditingValue correctCaretOffset(
  1. TextEditingValue value,
  2. InlineSpan textSpan,
  3. TextInputConnection? textInputConnection, {
  4. TextEditingValue? oldValue,
})

correct caret Offset make sure caret is not in text when caretIn is false

Implementation

static TextEditingValue correctCaretOffset(
  TextEditingValue value,
  InlineSpan textSpan,
  TextInputConnection? textInputConnection, {
  TextEditingValue? oldValue,
}) {
  final TextSelection selection = value.selection;

  if (selection.isValid && selection.isCollapsed) {
    int caretOffset = selection.extentOffset;

    // move to previous or next
    // https://github.com/fluttercandies/extended_text_field/issues/210
    bool? movePrevious;
    if (oldValue != null) {
      final TextSelection oldSelection = oldValue.selection;
      if (oldSelection.isValid && oldSelection.isCollapsed) {
        final int moveOffset = selection.baseOffset - oldSelection.baseOffset;

        if (moveOffset < 0) {
          movePrevious = true;
        } else if (moveOffset > 0) {
          movePrevious = false;
        }
      }
    }

    // correct caret Offset
    // make sure caret is not in text when deleteAll is true
    //
    textSpan.visitChildren((InlineSpan span) {
      if (span is SpecialInlineSpanBase &&
          (span as SpecialInlineSpanBase).deleteAll) {
        final SpecialInlineSpanBase specialTs = span as SpecialInlineSpanBase;
        if (caretOffset >= specialTs.start && caretOffset <= specialTs.end) {
          if (movePrevious != null) {
            if (movePrevious) {
              caretOffset = specialTs.start;
            } else {
              caretOffset = specialTs.end;
            }
          } else {
            if (caretOffset >
                (specialTs.end - specialTs.start) / 2.0 + specialTs.start) {
              //move caretOffset to end
              caretOffset = specialTs.end;
            } else {
              caretOffset = specialTs.start;
            }
          }

          return false;
        }
      }
      return true;
    });

    ///tell textInput caretOffset is changed.
    if (caretOffset != selection.baseOffset) {
      value = value.copyWith(
          selection: selection.copyWith(
              baseOffset: caretOffset, extentOffset: caretOffset));
      textInputConnection?.setEditingState(value);
    }
  }
  return value;
}