Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 5.16.0

**Feature**

- [#759](https://github.com/FlutterGen/flutter_gen/issues/759) Added `flutter_gen_interface` to allow generated asset classes to implement a shared custom interface for Modular Architectures & Design Systems.

## 5.15.0

**Feature**
Expand Down
4 changes: 3 additions & 1 deletion examples/example/lib/gen/assets.gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,9 @@ class $AssetsLottieWrongGen {
List<String> get values => [dummy, rocketLottieV439];
}

abstract final class MyAssets {
class MyAssets {
const MyAssets._();

static const String readme = 'README.md';
static const $AssetsFlareGen flare = $AssetsFlareGen();
static const $AssetsImagesGen images = $AssetsImagesGen();
Expand Down
4 changes: 3 additions & 1 deletion examples/example/lib/gen/colors.gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
import 'package:flutter/painting.dart';
import 'package:flutter/material.dart';

abstract final class MyColorName {
class MyColorName {
MyColorName._();

/// Color: #000000
static const Color black = Color(0xFF000000);

Expand Down
4 changes: 3 additions & 1 deletion examples/example/lib/gen/fonts.gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
// ignore_for_file: type=lint
// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import

abstract final class MyFontFamily {
class MyFontFamily {
MyFontFamily._();

/// Font family: Raleway
static const String raleway = 'Raleway';

Expand Down
4 changes: 3 additions & 1 deletion examples/example_resources/lib/gen/assets.gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ class $AssetsUnknownGen {
List<String> get values => [unknownMimeType];
}

abstract final class ResAssets {
class ResAssets {
const ResAssets._();

static const String package = 'example_resources';

static const $AssetsImagesGen images = $AssetsImagesGen();
Expand Down
4 changes: 3 additions & 1 deletion examples/example_resources/lib/gen/colors.gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
import 'package:flutter/painting.dart';
import 'package:flutter/material.dart';

abstract final class ColorName {
class ColorName {
ColorName._();

/// Color: #000000
static const Color black = Color(0xFF000000);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ class $AssetsImagesGen {
List<AssetGenImage> get values => [flutter3];
}

abstract final class GalleryOneAssets {
class GalleryOneAssets {
const GalleryOneAssets._();

static const $AssetsImagesGen images = $AssetsImagesGen();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class $AssetsImagesGen {
List<String> get values => [dart];
}

abstract final class GalleryTwoAssets {
class GalleryTwoAssets {
const GalleryTwoAssets._();

static const $AssetsImagesGen images = $AssetsImagesGen();
}
3 changes: 3 additions & 0 deletions melos.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ packages:
- packages/command
- packages/core
- packages/runner
- packages/flutter_gen_interface
- examples/example
- examples/example_resources
- examples/example_workspace
Expand Down Expand Up @@ -136,6 +137,7 @@ scripts:
- flutter_gen
- flutter_gen_core
- flutter_gen_runner
- flutter_gen_interface

publish:dry:
run: dart pub publish --dry-run
Expand All @@ -147,3 +149,4 @@ scripts:
- flutter_gen
- flutter_gen_core
- flutter_gen_runner
- flutter_gen_interface
13 changes: 11 additions & 2 deletions packages/core/lib/generators/assets_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ Future<String> generateAssets(
'The value of "flutter/assets:" is incorrect.',
);
}

final integrations = <Integration>[
if (config.flutterGen.integrations.image)
ImageIntegration(
Expand Down Expand Up @@ -165,7 +164,17 @@ Future<String> generateAssets(

final importsBuffer = StringBuffer();
for (final e in imports.sorted((a, b) => a.import.compareTo(b.import))) {
importsBuffer.writeln(import(e));
if (e.import ==
'package:flutter_gen_interface/flutter_gen_interface.dart') {
importsBuffer.writeln(
'import \'package:flutter_gen_interface/flutter_gen_interface.dart\';',
);
importsBuffer.writeln(
'export \'package:flutter_gen_interface/flutter_gen_interface.dart\';',
);
} else {
importsBuffer.writeln(import(e));
}
}

final buffer = StringBuffer();
Expand Down
109 changes: 8 additions & 101 deletions packages/core/lib/generators/integrations/image_integration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,109 +26,13 @@ class ImageIntegration extends Integration {

@override
List<Import> get requiredImports => const [
Import('package:flutter/widgets.dart'),
Import(
'package:flutter_gen_interface/flutter_gen_interface.dart',
),
];

@override
String get classOutput => _classDefinition;

String get _classDefinition => '''class AssetGenImage {
const AssetGenImage(
this._assetName, {
this.size,
this.flavors = const {},
this.animation,
});

final String _assetName;

${isPackage ? "\n static const String package = '$packageName';" : ''}

final Size? size;
final Set<String> flavors;
final AssetGenImageAnimation? animation;

Image image({
Key? key,
AssetBundle? bundle,
ImageFrameBuilder? frameBuilder,
ImageErrorWidgetBuilder? errorBuilder,
String? semanticLabel,
bool excludeFromSemantics = false,
double? scale,
double? width,
double? height,
Color? color,
Animation<double>? opacity,
BlendMode? colorBlendMode,
BoxFit? fit,
AlignmentGeometry alignment = Alignment.center,
ImageRepeat repeat = ImageRepeat.noRepeat,
Rect? centerSlice,
bool matchTextDirection = false,
bool gaplessPlayback = true,
bool isAntiAlias = false,
${isPackage ? '$deprecationMessagePackage\n' : ''}String? package$packageParameter,
FilterQuality filterQuality = FilterQuality.medium,
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,
);
}

ImageProvider provider({
AssetBundle? bundle,
${isPackage ? '$deprecationMessagePackage\n' : ''}String? package$packageParameter,
}) {
return AssetImage(
_assetName,
bundle: bundle,
package: package,
);
}

String get path => _assetName;

String get keyName => $keyName;
}

class AssetGenImageAnimation {
const AssetGenImageAnimation({
required this.isAnimation,
required this.duration,
required this.frames,
});

final bool isAnimation;
final Duration duration;
final int frames;
}
''';
String get classOutput => '';

@override
String get className => 'AssetGenImage';
Expand Down Expand Up @@ -157,7 +61,10 @@ class AssetGenImageAnimation {
final flavors = asset.flavors.map((e) => '\'$e\'').join(', ');
buffer.write(flavors);
buffer.write('}');
buffer.write(','); // Better formatting.
if (!isPackage) buffer.write(','); // Better formatting.
}
if (isPackage) {
buffer.write(', package: \'$packageName\',');
}
buffer.write(')');
return buffer.toString();
Expand Down
46 changes: 13 additions & 33 deletions packages/core/lib/generators/integrations/svg_integration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ class SvgIntegration extends Integration {
super.parseMetadata,
}) : super(packageName);

String get packageExpression => isPackage ? ' = package' : '';

@override
List<Import> get requiredImports => const [
Import('package:flutter_gen_interface/flutter_gen_interface.dart'),
Import('package:flutter/widgets.dart'),
Import('package:flutter/services.dart'),
Import('package:flutter_svg/flutter_svg.dart', alias: '_svg'),
Expand All @@ -23,31 +22,13 @@ class SvgIntegration extends Integration {
@override
String get classOutput => _classDefinition;

String get _classDefinition => '''class SvgGenImage {
const SvgGenImage(
this._assetName, {
this.size,
this.flavors = const {},
}) : _isVecFormat = false;

const SvgGenImage.vec(
this._assetName, {
this.size,
this.flavors = const {},
}) : _isVecFormat = true;

final String _assetName;
final Size? size;
final Set<String> flavors;
final bool _isVecFormat;

${isPackage ? "\n static const String package = '$packageName';" : ''}

String get _classDefinition =>
'''extension SvgGenImageExtension on SvgGenImage {
_svg.SvgPicture svg({
Key? key,
bool matchTextDirection = false,
AssetBundle? bundle,
${isPackage ? '$deprecationMessagePackage\n' : ''}String? package$packageExpression,
${isPackage ? '$deprecationMessagePackage\n' : ''}String? package,
double? width,
double? height,
BoxFit fit = BoxFit.contain,
Expand All @@ -65,17 +46,17 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
@deprecated bool cacheColorFilter = false,
}) {
final _svg.BytesLoader loader;
if (_isVecFormat) {
if (isVecFormat) {
loader = _vg.AssetBytesLoader(
_assetName,
path,
assetBundle: bundle,
packageName: package,
packageName: package ?? this.package,
);
} else {
loader = _svg.SvgAssetLoader(
_assetName,
path,
assetBundle: bundle,
packageName: package,
packageName: package ?? this.package,
theme: theme,
colorMapper: colorMapper,
);
Expand All @@ -97,10 +78,6 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
cacheColorFilter: cacheColorFilter,
);
}

String get path => _assetName;

String get keyName => ${isPackage ? '\'packages/$packageName/\$_assetName\'' : '_assetName'};
}''';

@override
Expand All @@ -127,7 +104,10 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
final flavors = asset.flavors.map((e) => '\'$e\'').join(', ');
buffer.write(flavors);
buffer.write('}');
buffer.write(','); // Better formatting.
if (!isPackage) buffer.write(','); // Better formatting.
}
if (isPackage) {
buffer.write(', package: \'$packageName\',');
}
buffer.write(')');
return buffer.toString();
Expand Down
19 changes: 15 additions & 4 deletions packages/core/test/assets_gen_integrations_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -174,20 +174,31 @@ void main() {
isFalse,
);
expect(integration.isConstConstructor, isTrue);
expect(
integration.classOutput.contains(
'extension SvgGenImageExtension on SvgGenImage',
),
isTrue,
);
expect(integration.classOutput.contains('String? package,'), isTrue);

final integrationWithPackage = SvgIntegration('package_name');
expect(
integrationWithPackage.classOutput.contains(
'String? package = package,',
"@Deprecated('Do not specify package for a generated library asset')",
),
isTrue,
);
expect(
integrationWithPackage.classOutput.contains(
"static const String package = 'package_name';",
integrationWithPackage.classInstantiate(
AssetType(
rootPath: resPath,
path: 'assets/path/dog.svg',
flavors: {},
transformers: {},
),
),
isTrue,
"SvgGenImage('assets/path/dog.svg', package: 'package_name',)",
);
});

Expand Down
Loading