generateAllInOne static method
Generate a single aggregated file: assets.gen.dart
Implementation
static Future<void> generateAllInOne(
List<String> assetEntries,
AssetConfig config,
) async {
final assets = await _expandAssetEntries(assetEntries);
if (!config.outputDirectory.existsSync()) {
config.outputDirectory.createSync(recursive: true);
}
// Group by first meaningful folder (after "assets" if present)
final Map<String, List<String>> groups = {};
for (final a in assets) {
final normalized = a.replaceAll('\\', '/');
final segments = normalized.split('/');
String group;
if (segments.isNotEmpty && segments[0] == 'assets') {
if (segments.length >= 3) {
group = segments[1];
} else if (segments.length == 2) {
group = 'root';
} else {
group = 'root';
}
} else {
group = segments.isNotEmpty ? segments[0] : 'root';
}
groups.putIfAbsent(group, () => []).add(normalized);
}
final sb = StringBuffer();
sb.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
sb.writeln('// Generated by asset generator');
sb.writeln();
sb.writeln('class Assets {');
sb.writeln(' Assets._();');
// create static fields for each group
for (final group in groups.keys) {
final className = _pascalCaseSafe(group == 'root' ? 'AssetsRoot' : group);
final fieldName = _camelCaseSafe(group == 'root' ? 'assets' : group);
sb.writeln(' static const $className $fieldName = $className();');
}
sb.writeln('}');
sb.writeln();
// write classes for each group
for (final entry in groups.entries) {
final group = entry.key;
final paths = entry.value;
final className = _pascalCaseSafe(group == 'root' ? 'AssetsRoot' : group);
sb.writeln('abstract class $className {');
// field name uniqueness map
final used = <String, int>{};
for (final path in paths) {
final base = _basenameWithoutExtension(path);
var fieldName = _sanitizeFieldName(base);
if (used.containsKey(fieldName)) {
used[fieldName] = used[fieldName]! + 1;
fieldName = '${fieldName}_${used[fieldName]}';
} else {
used[fieldName] = 1;
}
sb.writeln(" static const String $fieldName = '$path';");
}
sb.writeln('}');
sb.writeln();
}
final outFile = File(
'${config.outputDirectory.path}${Platform.pathSeparator}assets.gen.dart',
);
outFile.writeAsStringSync(sb.toString());
}