paginate method

Future<List<int>> paginate()

分页处理,返回每个分页的开始下标列表

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;
}