paint method

  1. @override
void paint(
  1. Canvas canvas,
  2. Rect rect, {
  3. TextDirection? textDirection,
  4. BoxShape shape = BoxShape.rectangle,
  5. BorderRadius? borderRadius,
})
override

Paints the border within the given Rect on the given Canvas.

Uniform borders are more efficient to paint than more complex borders.

You can provide a BoxShape to draw the border on. If the shape in BoxShape.circle, there is the requirement that the border isUniform.

If you specify a rectangular box shape (BoxShape.rectangle), then you may specify a BorderRadius. If a borderRadius is specified, there is the requirement that the border isUniform.

The getInnerPath and getOuterPath methods do not know about the shape and borderRadius arguments.

The textDirection argument is used to determine which of start and end map to the left and right. For TextDirection.ltr, the start is the left and the end is the right; for TextDirection.rtl, it is the reverse.

See also:

  • paintBorder, which is used if the border has non-uniform colors or styles and no borderRadius.

Implementation

@override
void paint(
  Canvas canvas,
  Rect rect, {
  TextDirection? textDirection,
  BoxShape shape = BoxShape.rectangle,
  BorderRadius? borderRadius,
}) {
  if (isUniform) {
    switch (top.style) {
      case BorderStyle.none:
        return;
      case BorderStyle.solid:
        switch (shape) {
          case BoxShape.circle:
            assert(borderRadius == null, 'A borderRadius cannot be given when shape is a BoxShape.circle.');
            BoxBorder._paintUniformBorderWithCircle(canvas, rect, top);
          case BoxShape.rectangle:
            if (borderRadius != null && borderRadius != BorderRadius.zero) {
              BoxBorder._paintUniformBorderWithRadius(canvas, rect, top, borderRadius);
              return;
            }
            BoxBorder._paintUniformBorderWithRectangle(canvas, rect, top);
        }
        return;
    }
  }

  if (_styleIsUniform && top.style == BorderStyle.none) {
    return;
  }

  assert(textDirection != null, 'Non-uniform BorderDirectional objects require a TextDirection when painting.');
  final (BorderSide left, BorderSide right) = switch (textDirection!) {
    TextDirection.rtl => (end, start),
    TextDirection.ltr => (start, end),
  };

  // Allow painting non-uniform borders if the visible colors are uniform.
  final Set<Color> visibleColors = _distinctVisibleColors();
  final bool hasHairlineBorder = _hasHairlineBorder;
  if (visibleColors.length == 1 &&
      !hasHairlineBorder &&
      (shape == BoxShape.circle ||
          (borderRadius != null && borderRadius != BorderRadius.zero))) {
    BoxBorder.paintNonUniformBorder(canvas, rect,
        shape: shape,
        borderRadius: borderRadius,
        textDirection: textDirection,
        top: top.style == BorderStyle.none ? BorderSide.none : top,
        right: right.style == BorderStyle.none ? BorderSide.none : right,
        bottom: bottom.style == BorderStyle.none ? BorderSide.none : bottom,
        left: left.style == BorderStyle.none ? BorderSide.none : left,
        color: visibleColors.first);
    return;
  }

  if (hasHairlineBorder) {
    assert(borderRadius == null || borderRadius == BorderRadius.zero, 'A side like `BorderSide(width: 0.0, style: BorderStyle.solid)` can only be drawn when BorderRadius is zero or null.');
  }
  assert(borderRadius == null, 'A borderRadius can only be given for borders with uniform colors.');
  assert(shape == BoxShape.rectangle, 'A Border can only be drawn as a circle on borders with uniform colors.');
  assert(_strokeAlignIsUniform && top.strokeAlign == BorderSide.strokeAlignInside, 'A Border can only draw strokeAlign different than strokeAlignInside on borders with uniform colors.');

  paintBorder(canvas, rect, top: top, left: left, bottom: bottom, right: right);
}