renderPipeline function

RenderPipelineResult renderPipeline(
  1. Widget root,
  2. Size terminalSize
)

Implementation

RenderPipelineResult renderPipeline(Widget root, Size terminalSize) {
  final element = root.createElement();
  element.mount(null, null);

  Widget resolve(Widget w) {
    var current = w;
    for (var i = 0; i < 100; i++) {
      if (current is StatelessWidget || current is StatefulWidget) {
        final el = current.createElement();
        el.mount(element, null);
        current = el.build();
      } else {
        break;
      }
    }
    return current;
  }

  final resolved = resolve(root);

  RenderObject buildRenderTree(Widget widget) {
    if (widget is RenderWidget) {
      final renderObj = widget.createRenderObject();
      if (widget is SingleChildRenderWidget) {
        final single = renderObj as RenderSingleChild;
        if (widget.child != null) {
          final childRender = buildRenderTree(resolve(widget.child!));
          single.setChild(childRender);
        }
      } else if (widget is MultiChildRenderWidget) {
        final multi = renderObj as RenderMultiChild;
        final childrenRenders = widget.children
            .map((c) => buildRenderTree(resolve(c)))
            .toList();
        multi.setChildren(childrenRenders);
      }
      return renderObj;
    }
    if (widget is StatelessWidget || widget is StatefulWidget) {
      final el = widget.createElement();
      el.mount(element, null);
      return buildRenderTree(resolve(el.build()));
    }
    return _emptyRender;
  }

  final rootRender = buildRenderTree(resolved);
  rootRender.layout(BoxConstraints.loose(terminalSize));
  return RenderPipelineResult(rootRender, element);
}