generateDartComponent function
Implementation
void generateDartComponent(
String name, List<FieldDef> fields, String dartPath) {
final className = '${toPascalCase(name)}Component';
final componentType = toCamelCase(name);
final buffer = StringBuffer();
buffer.writeln("import 'package:flutter/material.dart';");
buffer.writeln(
"import 'package:sdui_flutter_sanity/sdui_flutter_sanity.dart';\n");
buffer.writeln('class $className extends SduiComponent {');
buffer.writeln(" @override");
buffer.writeln(" String get type => '$componentType';\n");
buffer.writeln(' @override');
buffer.writeln(
' Widget build(BuildContext context, UiNode node, Widget Function(UiNode) buildChild) {');
for (var field in fields) {
final cast = getDartCast(field.type);
// Preserve the original field name as the Dart variable name (already camelCase from CMS)
final varName = toCamelCase(field.name);
if (field.type.toLowerCase() == 'number') {
buffer
.writeln(" final $varName = (node.props['${field.name}'] $cast;");
} else {
buffer.writeln(" final $varName = node.props['${field.name}'] $cast;");
}
}
buffer.writeln(
'\n // TODO: Implement your custom widget using the extracted properties.');
buffer.writeln(' return const Placeholder();');
buffer.writeln(' }');
buffer.writeln('}');
final dir = Directory(dartPath);
if (!dir.existsSync()) {
dir.createSync(recursive: true);
}
final file = File('${dir.path}/${toSnakeCase(name)}_component.dart');
file.writeAsStringSync(buffer.toString());
print('✅ Generated Dart Component: ${file.path}');
}