getCaretX method

double? getCaretX(
  1. String fragmentId,
  2. int localOffset
)

Returns the global x coordinate (logical pixels) of the caret for fragmentId at localOffset. Returns null if the fragment does not belong to this paragraph (used by ParagraphRegistry to iterate).

Implementation

double? getCaretX(String fragmentId, int localOffset) {
  final globalOffset = _localToGlobal(fragmentId, localOffset);
  if (globalOffset == null) return null;

  // Use the character box for precise X (left/right of the real box).
  // More accurate than getOffsetForCaret which can round or be wrong
  // near fragment borders or WidgetSpan.
  TextBox? charBox;
  final textLength = _painter.text?.toPlainText().length ?? 0;
  if (globalOffset > 0 && globalOffset <= textLength) {
    final boxes = _painter.getBoxesForSelection(
      TextSelection(baseOffset: globalOffset - 1, extentOffset: globalOffset),
    );
    if (boxes.isNotEmpty) charBox = boxes.first;
  } else if (globalOffset == 0 && textLength > 0) {
    final boxes = _painter.getBoxesForSelection(
      TextSelection(baseOffset: 0, extentOffset: 1),
    );
    if (boxes.isNotEmpty) charBox = boxes.first;
  }

  final xAlign = _alignmentXOffset;
  if (charBox != null) {
    final x = globalOffset == 0 ? charBox.left : charBox.right;
    return localToGlobal(Offset(x + xAlign, 0)).dx;
  }

  // Fallback
  final caretOffset = _painter.getOffsetForCaret(
    TextPosition(offset: globalOffset),
    Rect.zero,
  );
  return localToGlobal(Offset(caretOffset.dx + xAlign, caretOffset.dy)).dx;
}