exceedsMaxLines static method

bool exceedsMaxLines({
  1. required Delta delta,
  2. required TextStyle baseStyle,
  3. required double maxWidth,
  4. required int maxLines,
  5. MentionConfig? mentionConfig,
  6. EmojiConfig? emojiConfig,
  7. TextDirection textDirection = TextDirection.ltr,
  8. TextScaler textScaler = TextScaler.noScaling,
})

Проверяет, не помещается ли delta в maxLines визуальных строк при ширине maxWidth и стиле baseStyle.

В отличие от DeltaExtensions.lineCount (количество символов '\n'), учитывает перенос длинных абзацев по словам — то есть реальную раскладку текста, как её делает DeltaTextView. Используется для решения, нужна ли кнопка «Развернуть».

Эмбеды (упоминания, emoji) для измерения конвертируются в текст (@имя и сам символ emoji), поэтому ширина чипа/emoji оценивается приблизительно — этого достаточно для булева результата.

Implementation

static bool exceedsMaxLines({
  required Delta delta,
  required TextStyle baseStyle,
  required double maxWidth,
  required int maxLines,
  MentionConfig? mentionConfig,
  EmojiConfig? emojiConfig,
  TextDirection textDirection = TextDirection.ltr,
  TextScaler textScaler = TextScaler.noScaling,
}) {
  if (maxLines <= 0 || maxWidth <= 0 || !maxWidth.isFinite) return false;

  final plainDelta = deltaWithMentionsAsText(
    deltaWithEmojisAsText(delta, emojiConfig: emojiConfig),
    mentionConfig: mentionConfig,
  );

  final spans = parseDeltaToSpans(
    delta: plainDelta,
    baseStyle: baseStyle,
    applyBlockPrefixes: true,
  );

  final painter = TextPainter(
    text: TextSpan(children: spans),
    textDirection: textDirection,
    maxLines: maxLines,
    textScaler: textScaler,
  )..layout(maxWidth: maxWidth);

  final exceeds = painter.didExceedMaxLines;
  painter.dispose();
  return exceeds;
}