create method

  1. @override
Widget create(
  1. GridWidgetData data,
  2. Environment environment,
  3. BuildContext context
)
override

create the widget given a WidgetData type data the widget data environment the current Environment context the BuildContext

Implementation

@override
Widget create(GridWidgetData data, Environment environment, BuildContext context) {
  final spacing = data.spacing.toDouble();

  if (data.cols.isEmpty || data.rows.isEmpty) {
    return const SizedBox.shrink();
  }

  final columnWidths = <int, TableColumnWidth>{
    for (var i = 0; i < data.cols.length; i++)
      i: switch (data.cols[i].sizeMode) {
        GridSizeMode.fixed => FixedColumnWidth(data.cols[i].size),
        GridSizeMode.flex => FlexColumnWidth(data.cols[i].size),
        GridSizeMode.auto => const IntrinsicColumnWidth(),
      }
  };

  // REMOVED _alignedCellContent for the same reasons as above.

  return Table(
    key: ValueKey(data.id),
    defaultVerticalAlignment: TableCellVerticalAlignment.middle,
    columnWidths: columnWidths,
    defaultColumnWidth: const FlexColumnWidth(1.0),
    children: List.generate(data.rows.length, (rowIndex) {
      final row = data.rows[rowIndex];
      return TableRow(
        children: List.generate(data.cols.length, (colIndex) {
          final col = data.cols[colIndex];
          final childModel = findElement(
            data.children,
                (w) => w.cell?.row == rowIndex && w.cell?.col == colIndex,
          );

          Widget content;

          if (childModel != null) {
            content = DynamicWidget(model: childModel, meta: typeRegistry[childModel.type]);

            // 1. HORIZONTAL ALIGNMENT: Wrap the content in Align/Container
            if (col.alignment != GridAlignment.stretch) {
              content = Align(
                alignment: _mapGridAlignmentToFlutterAlignment(col.alignment, GridAlignment.center),
                child: content,
              );
            }
          } else {
            // Empty cell placeholder
            content = const SizedBox.shrink();
          }

          // 2. WRAP IN PADDING: Apply the spacing/padding
          content = Padding(
            padding: EdgeInsets.all(spacing / 2),
            child: content,
          );

          // 3. VERTICAL ALIGNMENT: MUST wrap in TableCell
          return TableCell(
            verticalAlignment: _mapGridAlignmentToVertical(row.alignment),
            child: content,
          );
        }),
      );
    }),
  );
}