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