Флаттер: как получить количество строк текста - PullRequest
0 голосов
/ 08 января 2019

Как получить количество строк текста В нашем проекте Flutter нам нужно определить, превышает ли количество строк текста 3, тогда мы выведем сообщение с подсказкой. Как мы можем использовать код для его реализации?

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Если у вас есть объект TextPainter и вы уже вызвали layout, то вы можете получить количество строк, выбрав все и вызвав getBoxesForSelection. Каждая коробка имеет размер строки.

TextSelection selection = TextSelection(baseOffset: 0, extentOffset: text.length);
List<TextBox> boxes = textPainter.getBoxesForSelection(selection);
int numberOfLines = boxes.length;

Вот пример:

final text = 'My text line.\nThis line wraps to the next.\nAnother line.';

enter image description here

print(numberOfLines); // 4

К сожалению, это не работает, если существует двунаправленный текст:

final text = 'My text line.\nThis كلمة makes more boxes.\nAnother line.';

enter image description here

print(numberOfLines); // 6

Этого можно преодолеть, считая только коробки, расположенные вдоль одного края. Если вы заметили данные сверху, есть только четыре поля, которые имеют ребро в 0.0.

flutter: TextBox.fromLTRBD(0.0, 0.2, 171.8, 36.0, TextDirection.ltr)
flutter: TextBox.fromLTRBD(0.0, 36.5, 68.4, 72.3, TextDirection.ltr)
flutter: TextBox.fromLTRBD(68.4, 38.2, 111.5, 75.0, TextDirection.rtl)
flutter: TextBox.fromLTRBD(111.5, 36.5, 299.9, 72.3, TextDirection.ltr)
flutter: TextBox.fromLTRBD(0.0, 77.2, 92.2, 113.0, TextDirection.ltr)
flutter: TextBox.fromLTRBD(0.0, 113.2, 179.7, 149.0, TextDirection.ltr)

Хотелось бы, чтобы был метод TextPainter.numberOfLines, но я его не нашел.

Обновление:

Существует предложение , чтобы добавить эту функцию.

0 голосов
/ 09 января 2019

Если вы просто хотите проверить количество строк, содержащихся в тексте, вы можете сделать простой

final numLines = '\n'.allMatches(yourText).length + 1;

Однако, я думаю, вас больше интересует количество строк, которые на самом деле отображаются визуально. Здесь все становится немного сложнее, потому что вам нужно знать доступное пространство (BoxConstraints), чтобы вычислить, сколько строк нужно тексту. Для этого вы можете использовать LayoutBuilder, чтобы отложить построение виджета, и TextPainter, чтобы выполнить фактический расчет:

return LayoutBuilder(builder: (context, size) {
  final span = TextSpan(text: yourText, style: yourStyle);
  final tp = TextPainter(text: span, maxLines: 3);
  tp.layout(maxWidth: size.maxWidth);

  if (tp.didExceedMaxLines) {
    // The text has more than three lines.
    // TODO: display the prompt message
    return Container(color: Colors.red);
  } else {
    return Text(yourText, style: yourStyle);
  }
});

Я извлек часть кода из пакета auto_size_text pub , который также может быть вам интересен: Он изменяет размер своего текста так, чтобы он помещался в заданное пространство.

Во всяком случае, будьте осторожны при отображении подсказки: Метод build вашего виджета может вызываться несколько раз в секунду, что приводит к одновременному отображению нескольких подсказок.

...