create method
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,
);
}),
);
}),
);
}