paint method
Default paint implementation.
RenderBox paints no self-content; it forwards painting to its RenderBox children. Subclasses override to draw their own content.
Implementation
@override
void paint(PaintingContext context, Offset offset) {
if (size.width <= 0 || size.height <= 0) return;
final layout = _layout;
if (layout == null) return;
final absoluteX = offset.dx + x;
final absoluteY = offset.dy + y;
final availableWidth = size.width;
final textWidth = layout.maxLineWidth;
final maxLinesLimit = _maxLinesLimit(layout);
final linesToRender = math.min(size.height, maxLinesLimit);
if (linesToRender <= 0) {
return;
}
final paintedLines = math.min(linesToRender, layout.lines.length);
for (var lineIndex = 0; lineIndex < paintedLines; lineIndex++) {
final lineWidth = layout.lines[lineIndex].width;
final shift = _lineShift(lineWidth, availableWidth);
final textX = math.max(0, shift);
final sourceLeft = math.max(0, -shift);
final sourceWidth = math.min(
lineWidth - sourceLeft,
availableWidth - textX,
);
if (sourceWidth <= 0) {
continue;
}
context.canvas.drawTextLayout(
layout,
Offset(absoluteX + textX, absoluteY + lineIndex),
sourceRect: Rect.fromLTWH(sourceLeft, lineIndex, sourceWidth, 1),
selection: _selection,
);
}
final needsWidthClip = textWidth > availableWidth;
final needsHeightClip = layout.lineCount > linesToRender;
if (_overflow == TextOverflow.ellipsis &&
(needsWidthClip || needsHeightClip)) {
final ellipsis = _ellipsisForWidth(availableWidth);
if (ellipsis.isNotEmpty) {
final ellipsisLineY = absoluteY + linesToRender - 1;
final ellipsisX =
absoluteX + availableWidth - terminalStringWidth(ellipsis);
_paintEllipsis(context, ellipsisX, ellipsisLineY, ellipsis);
}
}
}