paint method

  1. @override
void paint(
  1. PaintingContext context,
  2. Offset offset
)
override

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

  var textX = absoluteX;
  switch (_alignment) {
    case TextAlignment.left:
      break;
    case TextAlignment.center:
      textX =
          absoluteX +
          ((availableWidth - textWidth).clamp(0, availableWidth) ~/ 2);
    case TextAlignment.right:
      textX =
          absoluteX + (availableWidth - textWidth).clamp(0, availableWidth);
  }

  final needsWidthClip = textWidth > availableWidth;
  final needsHeightClip = layout.lineCount > linesToRender;
  final hasClip = needsWidthClip || needsHeightClip;
  context.canvas.drawTextLayout(
    layout,
    Offset(textX, absoluteY),
    sourceRect: hasClip
        ? Rect.fromLTWH(0, 0, availableWidth, linesToRender)
        : null,
    selection: _selection,
  );

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