diff --git a/README.md b/README.md index d720352b3..65720cbf7 100644 --- a/README.md +++ b/README.md @@ -729,6 +729,8 @@ flutter_gen: assets: # Optional enabled: true + # Optional (default: Assets) + output_class: Assets # Optional # Set to true if you want this package to be a package dependency # See: https://flutter.dev/docs/development/ui/assets-and-images#from-packages diff --git a/packages/core/lib/generators/assets_generator.dart b/packages/core/lib/generators/assets_generator.dart index 8f9dd355c..2fc3dc071 100644 --- a/packages/core/lib/generators/assets_generator.dart +++ b/packages/core/lib/generators/assets_generator.dart @@ -61,7 +61,6 @@ String generateAssets( if (config.flutterGen.integrations.flareFlutter) FlareIntegration(), if (config.flutterGen.integrations.rive) RiveIntegration(), ]; - if (config.flutterGen.assets.isDotDelimiterStyle) { classesBuffer.writeln(_dotDelimiterStyleDefinition(config, integrations)); } else if (config.flutterGen.assets.isSnakeCaseStyle) { @@ -249,8 +248,10 @@ String _dotDelimiterStyleDefinition( assetTypeQueue.addAll(assetType.children); } } - buffer - .writeln(_dotDelimiterStyleAssetsClassDefinition(assetsStaticStatements)); + buffer.writeln(_dotDelimiterStyleAssetsClassDefinition( + assetsStaticStatements, + config.flutterGen.assets.outputClass, + )); return buffer.toString(); } @@ -306,27 +307,36 @@ String _flatStyleDefinition( ) .whereType<_Statement>() .toList(); - return _flatStyleAssetsClassDefinition(statements); + return _flatStyleAssetsClassDefinition( + statements, + config.flutterGen.assets.outputClass, + ); } -String _flatStyleAssetsClassDefinition(List<_Statement> statements) { +String _flatStyleAssetsClassDefinition( + List<_Statement> statements, + String outputClassName, +) { final statementsBlock = statements.map((statement) => '''${statement.toDartDocString()} ${statement.toStaticFieldString()} ''').join('\n'); - return _assetsClassDefinition(statementsBlock); + return _assetsClassDefinition(statementsBlock, outputClassName); } -String _dotDelimiterStyleAssetsClassDefinition(List<_Statement> statements) { +String _dotDelimiterStyleAssetsClassDefinition( + List<_Statement> statements, + String outputClassName, +) { final statementsBlock = statements.map((statement) => statement.toStaticFieldString()).join('\n'); - return _assetsClassDefinition(statementsBlock); + return _assetsClassDefinition(statementsBlock, outputClassName); } -String _assetsClassDefinition(String statementsBlock) { +String _assetsClassDefinition(String statementsBlock, String outputClassName) { return ''' -class Assets { - Assets._(); +class $outputClassName { + $outputClassName._(); $statementsBlock } diff --git a/packages/core/lib/settings/config.dart b/packages/core/lib/settings/config.dart index 1b5cb9cfc..71bf727e4 100644 --- a/packages/core/lib/settings/config.dart +++ b/packages/core/lib/settings/config.dart @@ -45,6 +45,7 @@ flutter_gen: assets: enabled: true + output_class: Assets package_parameter_enabled: false style: dot-delimiter diff --git a/packages/core/lib/settings/pubspec.dart b/packages/core/lib/settings/pubspec.dart index 76f388d7a..6d1282108 100644 --- a/packages/core/lib/settings/pubspec.dart +++ b/packages/core/lib/settings/pubspec.dart @@ -105,6 +105,7 @@ class FlutterGenAssets { required this.enabled, required this.packageParameterEnabled, required this.style, + required this.outputClass, }) { if (style != dotDelimiterStyle && style != snakeCaseStyle && @@ -122,6 +123,9 @@ class FlutterGenAssets { @JsonKey(name: 'style', required: true) final String style; + @JsonKey(name: 'output_class', required: true) + final String outputClass; + bool get isDotDelimiterStyle => style == dotDelimiterStyle; bool get isSnakeCaseStyle => style == snakeCaseStyle; diff --git a/packages/core/lib/settings/pubspec.g.dart b/packages/core/lib/settings/pubspec.g.dart index ea42e5f82..1332284ed 100644 --- a/packages/core/lib/settings/pubspec.g.dart +++ b/packages/core/lib/settings/pubspec.g.dart @@ -117,18 +117,25 @@ FlutterGenAssets _$FlutterGenAssetsFromJson(Map json) => $checkedCreate( ($checkedConvert) { $checkKeys( json, - requiredKeys: const ['enabled', 'package_parameter_enabled', 'style'], + requiredKeys: const [ + 'enabled', + 'package_parameter_enabled', + 'style', + 'output_class' + ], ); final val = FlutterGenAssets( enabled: $checkedConvert('enabled', (v) => v as bool), packageParameterEnabled: $checkedConvert('package_parameter_enabled', (v) => v as bool), style: $checkedConvert('style', (v) => v as String), + outputClass: $checkedConvert('output_class', (v) => v as String), ); return val; }, fieldKeyMap: const { - 'packageParameterEnabled': 'package_parameter_enabled' + 'packageParameterEnabled': 'package_parameter_enabled', + 'outputClass': 'output_class' }, ); diff --git a/packages/core/test/assets_gen_test.dart b/packages/core/test/assets_gen_test.dart index 40b2e034e..54d392c58 100644 --- a/packages/core/test/assets_gen_test.dart +++ b/packages/core/test/assets_gen_test.dart @@ -74,5 +74,13 @@ void main() { await expectedAssetsGen(pubspec, generated, fact); }); + + test('Assets with custom class name', () async { + const pubspec = 'test_resources/pubspec_assets_output_class.yaml'; + const fact = 'test_resources/actual_data/assets_output_class.gen.dart'; + const generated = 'test_resources/lib/gen/assets_output_class.gen.dart'; + + await expectedAssetsGen(pubspec, generated, fact); + }); }); } diff --git a/packages/core/test_resources/actual_data/assets_output_class.gen.dart b/packages/core/test_resources/actual_data/assets_output_class.gen.dart new file mode 100644 index 000000000..0e11fc72c --- /dev/null +++ b/packages/core/test_resources/actual_data/assets_output_class.gen.dart @@ -0,0 +1,93 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: directives_ordering,unnecessary_import + +import 'package:flutter/widgets.dart'; + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); +} + +class $AssetsImagesChip3Gen { + const $AssetsImagesChip3Gen(); + + /// File path: assets/images/chip3/chip3.jpg + AssetGenImage get chip3 => + const AssetGenImage('assets/images/chip3/chip3.jpg'); +} + +class MyAssets { + MyAssets._(); + + static const $AssetsImagesGen images = $AssetsImagesGen(); +} + +class AssetGenImage { + const AssetGenImage(this._assetName); + + final String _assetName; + + Image image({ + Key? key, + AssetBundle? bundle, + ImageFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + String? semanticLabel, + bool excludeFromSemantics = false, + double? scale, + double? width, + double? height, + Color? color, + Animation? opacity, + BlendMode? colorBlendMode, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect? centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = false, + bool isAntiAlias = false, + String? package, + FilterQuality filterQuality = FilterQuality.low, + int? cacheWidth, + int? cacheHeight, + }) { + return Image.asset( + _assetName, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + scale: scale, + width: width, + height: height, + color: color, + opacity: opacity, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + package: package, + filterQuality: filterQuality, + cacheWidth: cacheWidth, + cacheHeight: cacheHeight, + ); + } + + String get path => _assetName; + + String get keyName => _assetName; +} diff --git a/packages/core/test_resources/pubspec_assets_output_class.yaml b/packages/core/test_resources/pubspec_assets_output_class.yaml new file mode 100644 index 000000000..705fddb9c --- /dev/null +++ b/packages/core/test_resources/pubspec_assets_output_class.yaml @@ -0,0 +1,12 @@ +name: test + +flutter_gen: + output: lib/gen/ # Optional (default: lib/gen/) + line_length: 80 # Optional (default: 80) + + assets: + output_class: MyAssets + +flutter: + assets: + - assets/images/chip3/chip3.jpg