render method

  1. @override
void render(
  1. Buffer buffer,
  2. Rect area
)
override

Renders the underlying widget to the provided buffer within the area.

Implementation

@override
void render(Buffer buffer, Rect area) {
  final column = widget as Column;
  if (area.width <= 0 || area.height <= 0) return;

  final constraints = column.children
      .map((c) => _getConstraint(c, LayoutDirection.vertical))
      .toList();
  final rects = splitRect(area, constraints, LayoutDirection.vertical);

  final newElements = <Element>[];
  for (var i = 0; i < column.children.length; i++) {
    final childWidget = column.children[i];
    if (i < childElements.length &&
        childElements[i].widget.runtimeType == childWidget.runtimeType) {
      childElements[i].update(childWidget);
      newElements.add(childElements[i]);
    } else {
      if (i < childElements.length) {
        childElements[i].unmount();
      }
      final newEl = childWidget.createElement();
      newEl.mount(this);
      newElements.add(newEl);
    }
  }
  for (var i = column.children.length; i < childElements.length; i++) {
    childElements[i].unmount();
  }
  childElements = newElements;

  for (var i = 0; i < childElements.length; i++) {
    final childEl = childElements[i];
    final childArea = rects[i];
    final viewport = Viewport(buffer, childArea);
    childEl.render(viewport, Rect(0, 0, childArea.width, childArea.height));
  }
}