Можно пререндерить этот текст.
Но предварительно разбей на небольшие куски, иначе могут быть косяки.
А потому смотри, сколько влезло, подбирай размеры.
final TextPainter textPainter = TextPainter(
text: TextSpan(text: text, style: style), maxLines: 1, textDirection: TextDirection.ltr)
..layout(minWidth: 0, maxWidth: double.infinity);
return textPainter.size;
1) Возьми 1-ые 100 символов.
2) Сравни размер части текста с размерами экрана. Если еще влезает - еще бери.
3) Вычти из остального текста столько символов, сколько в итоге было в той части текста
6) Отрендери.
7) Повторяй так пока не выведешь весь текст.
8) Либо все делай через Fluture. Либо создай изолят, скорми ему текст, а он тебе пусть по требованию или периодически отдает куски текста. При его инициализации передай ему размер экрана или того виджета в котором будешь выводить текст. Если размеры хардкорные - тут все просто, иначе xthtp
double width = (context.findRenderObject() as RenderBox).size.width