getCaretY method
Implementation
double? getCaretY(String fragmentId, int localOffset) {
final globalOffset = _localToGlobal(fragmentId, localOffset);
if (globalOffset == null) return null;
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;
}
if (charBox != null) {
if (_lineMetricsDirty || _cachedLineMetrics == null) {
_cachedLineMetrics = _painter.computeLineMetrics();
_lineMetricsDirty = false;
}
final lineMetrics = _cachedLineMetrics!;
for (final lm in lineMetrics) {
if (lm.baseline >= charBox.top && lm.baseline <= charBox.bottom) {
return localToGlobal(Offset(0, lm.baseline)).dy;
}
}
return localToGlobal(Offset(0, (charBox.top + charBox.bottom) / 2)).dy;
}
final caretOffset = _painter.getOffsetForCaret(
TextPosition(offset: globalOffset),
Rect.zero,
);
return localToGlobal(caretOffset).dy;
}