paginate method
分页处理,返回每个分页的开始下标列表
Implementation
Future<List<int>> paginate() async {
if (_pageOffsets != null) return _pageOffsets!;
final List<int> offsets = [];
int start = 0;
final characterList = _characters.toList();
final availableWidth = pageWidth - padding.horizontal;
final availableHeight = pageHeight - padding.vertical;
while (start < characterList.length) {
offsets.add(start);
final remainingText = characterList.sublist(start).join();
final span = TextSpan(text: remainingText, style: textStyle);
final painter = TextPainter(
text: span,
textDirection: textDirection,
maxLines: null,
);
painter.layout(maxWidth: availableWidth);
final position = painter.getPositionForOffset(Offset(0, availableHeight));
final localOffset = position.offset;
final safeOffset = painter.getOffsetBefore(localOffset) ?? localOffset;
int nextStart =
start + _getCharacterIndexFromOffset(remainingText, safeOffset);
if (nextStart <= start) {
// If we're stuck near the end, just end it
if ((characterList.length - start) < 10) break;
nextStart = start + 1;
}
start = nextStart;
}
_pageOffsets = offsets;
return offsets;
}