buildRowColumnWidget static method

Widget buildRowColumnWidget(
  1. BaseNode rowColumnNode, {
  2. required List<Widget> childrenWidgets,
  3. required List<BaseNode> childrenNodes,
  4. required bool withScroll,
})

Implementation

static Widget buildRowColumnWidget(
  BaseNode rowColumnNode, {
  required List<Widget> childrenWidgets,
  required List<BaseNode> childrenNodes,
  required bool withScroll,
}) {
  assert(rowColumnNode is RowColumnMixin);

  final bool isRow =
      (rowColumnNode as RowColumnMixin).rowColumnType == RowColumnType.row;

  final double? fixWidth;
  final double? fixHeight;
  if (rowColumnNode.verticalFit == SizeFit.locked ||
      rowColumnNode.verticalFit == SizeFit.fixed) {
    fixHeight = rowColumnNode.outerBoxLocal.height;
  } else if (rowColumnNode.verticalFit == SizeFit.shrinkWrap) {
    fixHeight = rowColumnNode.constraints.minHeight;
  } else {
    fixHeight = rowColumnNode.constraints.maxHeight ?? double.infinity;
  }
  if (rowColumnNode.horizontalFit == SizeFit.locked ||
      rowColumnNode.horizontalFit == SizeFit.fixed) {
    fixWidth = rowColumnNode.outerBoxLocal.width;
  } else if (rowColumnNode.horizontalFit == SizeFit.shrinkWrap) {
    fixWidth = rowColumnNode.constraints.minWidth;
  } else {
    fixWidth = rowColumnNode.constraints.maxWidth ?? double.infinity;
  }

  if (isRow) {
    Widget res = Row(
      mainAxisAlignment: rowColumnNode.mainAxisAlignment.flutterAxis,
      crossAxisAlignment: rowColumnNode.crossAxisAlignment.flutterAxis,
      mainAxisSize: (rowColumnNode.horizontalFit == SizeFit.shrinkWrap)
          ? MainAxisSize.min
          : MainAxisSize.max,
      key: ValueKey(rowColumnNode.id),
      children: childrenWidgets,
    );

    if (fixHeight == null && rowColumnNode.isVerticalWrap) {
      final bool anyChildNeedsAlignment = childrenNodes.any(
        (child) => child.alignment != AlignmentModel.none,
      );
      if (anyChildNeedsAlignment) {
        res = IntrinsicHeight(child: res);
      }
    }

    if (withScroll &&
        rowColumnNode is ScrollableMixin &&
        (rowColumnNode as ScrollableMixin).isScrollable) {
      res = wrapWithPaddedScrollable(
        padding: rowColumnNode.resolvedPadding().flutterEdgeInsets,
        node: (rowColumnNode as ScrollableMixin),
        child: res,
      );
    }

    if (fixWidth == null && fixHeight == null) return res;

    return SizedBox(
      width: fixWidth,
      height: fixHeight,
      child: res,
    );
  } else {
    Widget res = Column(
      mainAxisAlignment: rowColumnNode.mainAxisAlignment.flutterAxis,
      crossAxisAlignment: rowColumnNode.crossAxisAlignment.flutterAxis,
      mainAxisSize: (rowColumnNode.verticalFit == SizeFit.shrinkWrap)
          ? MainAxisSize.min
          : MainAxisSize.max,
      key: ValueKey(rowColumnNode.id),
      children: childrenWidgets,
    );

    if (fixWidth == null && rowColumnNode.isHorizontalWrap) {
      final bool anyChildNeedsAlignment = childrenNodes.any(
        (child) => child.alignment != AlignmentModel.none,
      );
      if (anyChildNeedsAlignment) {
        res = IntrinsicWidth(child: res);
      }
    }

    if (withScroll &&
        rowColumnNode is ScrollableMixin &&
        (rowColumnNode as ScrollableMixin).isScrollable) {
      res = wrapWithPaddedScrollable(
        padding: rowColumnNode.resolvedPadding().flutterEdgeInsets,
        node: (rowColumnNode as ScrollableMixin),
        child: res,
      );
    }

    if (fixWidth == null && fixHeight == null) return res;

    return SizedBox(
      width: fixWidth,
      height: fixHeight,
      child: res,
    );
  }
}