Skip to content

Commit 72fa49e

Browse files
authored
Refactored the AssetGenImage code to be another Integration (#432)
## What does this change? Refactored the `AssetGenImage` code to be another Integration, so that it looks more similar to SVG/Lottie/Rive/etc. This simplifies the assets_generator, and no longer forces `AssetGenImage` to be output even when there are no images. This can help ensure all integration are on level footing (perhaps helping with task 1 in this list #384) ## Type of change - [x] Refactor to cleanup the code base. ## Checklist: Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open a GitHub issue as a bug/feature request before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [x] Ensure the tests (`melos run unit:test`) - [x] Ensure the analyzer and formatter pass (`melos run format` to automatically apply formatting)
1 parent ba28410 commit 72fa49e

14 files changed

+152
-589
lines changed

packages/core/lib/generators/assets_generator.dart

Lines changed: 4 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:dart_style/dart_style.dart';
66
import 'package:dartx/dartx.dart';
77
import 'package:flutter_gen_core/generators/generator_helper.dart';
88
import 'package:flutter_gen_core/generators/integrations/flare_integration.dart';
9+
import 'package:flutter_gen_core/generators/integrations/image_integration.dart';
910
import 'package:flutter_gen_core/generators/integrations/integration.dart';
1011
import 'package:flutter_gen_core/generators/integrations/lottie_integration.dart';
1112
import 'package:flutter_gen_core/generators/integrations/rive_integration.dart';
@@ -60,6 +61,7 @@ String generateAssets(
6061
final classesBuffer = StringBuffer();
6162

6263
final integrations = <Integration>[
64+
ImageIntegration(config.packageParameterLiteral),
6365
if (config.flutterGen.integrations.flutterSvg)
6466
SvgIntegration(config.packageParameterLiteral),
6567
if (config.flutterGen.integrations.flareFlutter)
@@ -162,11 +164,7 @@ String generateAssets(
162164
throw 'The value of "flutter_gen/assets/style." is incorrect.';
163165
}
164166

165-
classesBuffer.writeln(_assetGenImageClassDefinition(
166-
config.packageParameterLiteral,
167-
));
168-
169-
final imports = <String>{'package:flutter/widgets.dart'};
167+
final imports = <String>{};
170168
integrations
171169
.where((integration) => integration.isEnabled)
172170
.forEach((integration) {
@@ -254,17 +252,7 @@ _Statement? _createAssetTypeStatement(
254252
String name,
255253
) {
256254
final childAssetAbsolutePath = join(config.rootPath, assetType.path);
257-
if (assetType.isSupportedImage) {
258-
return _Statement(
259-
type: 'AssetGenImage',
260-
filePath: assetType.path,
261-
name: name,
262-
value: 'AssetGenImage(\'${posixStyle(assetType.path)}\')',
263-
isConstConstructor: true,
264-
isDirectory: false,
265-
needDartDoc: true,
266-
);
267-
} else if (FileSystemEntity.isDirectorySync(childAssetAbsolutePath)) {
255+
if (FileSystemEntity.isDirectorySync(childAssetAbsolutePath)) {
268256
final childClassName = '\$${assetType.path.camelCase().capitalize()}Gen';
269257
return _Statement(
270258
type: childClassName,
@@ -535,95 +523,6 @@ class $className {
535523
''';
536524
}
537525

538-
String _assetGenImageClassDefinition(String packageName) {
539-
final bool isPackage = packageName.isNotEmpty;
540-
final packageParameter = isPackage ? ' = package' : '';
541-
542-
final keyName = packageName.isEmpty
543-
? '_assetName'
544-
: "'packages/$packageName/\$_assetName'";
545-
546-
return '''
547-
548-
class AssetGenImage {
549-
const AssetGenImage(this._assetName);
550-
551-
final String _assetName;
552-
${isPackage ? "\n static const String package = '$packageName';" : ''}
553-
554-
Image image({
555-
Key? key,
556-
AssetBundle? bundle,
557-
ImageFrameBuilder? frameBuilder,
558-
ImageErrorWidgetBuilder? errorBuilder,
559-
String? semanticLabel,
560-
bool excludeFromSemantics = false,
561-
double? scale,
562-
double? width,
563-
double? height,
564-
Color? color,
565-
Animation<double>? opacity,
566-
BlendMode? colorBlendMode,
567-
BoxFit? fit,
568-
AlignmentGeometry alignment = Alignment.center,
569-
ImageRepeat repeat = ImageRepeat.noRepeat,
570-
Rect? centerSlice,
571-
bool matchTextDirection = false,
572-
bool gaplessPlayback = false,
573-
bool isAntiAlias = false,
574-
${isPackage ? deprecationMessagePackage : ''}
575-
String? package$packageParameter,
576-
FilterQuality filterQuality = FilterQuality.low,
577-
int? cacheWidth,
578-
int? cacheHeight,
579-
}) {
580-
return Image.asset(
581-
_assetName,
582-
key: key,
583-
bundle: bundle,
584-
frameBuilder: frameBuilder,
585-
errorBuilder: errorBuilder,
586-
semanticLabel: semanticLabel,
587-
excludeFromSemantics: excludeFromSemantics,
588-
scale: scale,
589-
width: width,
590-
height: height,
591-
color: color,
592-
opacity: opacity,
593-
colorBlendMode: colorBlendMode,
594-
fit: fit,
595-
alignment: alignment,
596-
repeat: repeat,
597-
centerSlice: centerSlice,
598-
matchTextDirection: matchTextDirection,
599-
gaplessPlayback: gaplessPlayback,
600-
isAntiAlias: isAntiAlias,
601-
package: package,
602-
filterQuality: filterQuality,
603-
cacheWidth: cacheWidth,
604-
cacheHeight: cacheHeight,
605-
);
606-
}
607-
608-
ImageProvider provider({
609-
AssetBundle? bundle,
610-
${isPackage ? deprecationMessagePackage : ''}
611-
String? package$packageParameter,
612-
}) {
613-
return AssetImage(
614-
_assetName,
615-
bundle: bundle,
616-
package: package,
617-
);
618-
}
619-
620-
String get path => _assetName;
621-
622-
String get keyName => $keyName;
623-
}
624-
''';
625-
}
626-
627526
class _Statement {
628527
const _Statement({
629528
required this.type,

packages/core/lib/generators/integrations/flare_integration.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import 'package:flutter_gen_core/generators/integrations/integration.dart';
22
import 'package:flutter_gen_core/settings/asset_type.dart';
33

44
class FlareIntegration extends Integration {
5-
FlareIntegration(String packageParameterLiteral)
6-
: super(packageParameterLiteral);
5+
FlareIntegration(String packageName) : super(packageName);
76

8-
String? get packageExpression =>
9-
isPackage ? 'packages/$packageParameterLiteral/' : null;
7+
String? get packageExpression => isPackage ? 'packages/$packageName/' : null;
108

119
@override
1210
List<String> get requiredImports => [
11+
'package:flutter/widgets.dart',
1312
'package:flare_flutter/flare_actor.dart',
1413
'package:flare_flutter/flare_controller.dart',
1514
];
@@ -21,7 +20,7 @@ class FlareIntegration extends Integration {
2120
const FlareGenImage(this._assetName);
2221
2322
final String _assetName;
24-
${isPackage ? "\n static const String package = '$packageParameterLiteral';" : ''}
23+
${isPackage ? "\n static const String package = '$packageName';" : ''}
2524
2625
FlareActor flare({
2726
String? boundsNode,
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import 'package:flutter_gen_core/generators/integrations/integration.dart';
2+
import 'package:flutter_gen_core/settings/asset_type.dart';
3+
4+
/// The main image integration, supporting all image asset types. See
5+
/// [isSupport] for the exact supported mime types.
6+
///
7+
/// This integration is by enabled by default.
8+
class ImageIntegration extends Integration {
9+
ImageIntegration(String packageName) : super(packageName);
10+
11+
String get packageParameter => isPackage ? ' = package' : '';
12+
13+
String get keyName =>
14+
isPackage ? "'packages/$packageName/\$_assetName'" : '_assetName';
15+
16+
@override
17+
List<String> get requiredImports => ['package:flutter/widgets.dart'];
18+
19+
@override
20+
String get classOutput => _classDefinition;
21+
22+
String get _classDefinition => '''class AssetGenImage {
23+
const AssetGenImage(this._assetName);
24+
25+
final String _assetName;
26+
${isPackage ? "\n static const String package = '$packageName';" : ''}
27+
28+
Image image({
29+
Key? key,
30+
AssetBundle? bundle,
31+
ImageFrameBuilder? frameBuilder,
32+
ImageErrorWidgetBuilder? errorBuilder,
33+
String? semanticLabel,
34+
bool excludeFromSemantics = false,
35+
double? scale,
36+
double? width,
37+
double? height,
38+
Color? color,
39+
Animation<double>? opacity,
40+
BlendMode? colorBlendMode,
41+
BoxFit? fit,
42+
AlignmentGeometry alignment = Alignment.center,
43+
ImageRepeat repeat = ImageRepeat.noRepeat,
44+
Rect? centerSlice,
45+
bool matchTextDirection = false,
46+
bool gaplessPlayback = false,
47+
bool isAntiAlias = false,
48+
${isPackage ? deprecationMessagePackage : ''}
49+
String? package$packageParameter,
50+
FilterQuality filterQuality = FilterQuality.low,
51+
int? cacheWidth,
52+
int? cacheHeight,
53+
}) {
54+
return Image.asset(
55+
_assetName,
56+
key: key,
57+
bundle: bundle,
58+
frameBuilder: frameBuilder,
59+
errorBuilder: errorBuilder,
60+
semanticLabel: semanticLabel,
61+
excludeFromSemantics: excludeFromSemantics,
62+
scale: scale,
63+
width: width,
64+
height: height,
65+
color: color,
66+
opacity: opacity,
67+
colorBlendMode: colorBlendMode,
68+
fit: fit,
69+
alignment: alignment,
70+
repeat: repeat,
71+
centerSlice: centerSlice,
72+
matchTextDirection: matchTextDirection,
73+
gaplessPlayback: gaplessPlayback,
74+
isAntiAlias: isAntiAlias,
75+
package: package,
76+
filterQuality: filterQuality,
77+
cacheWidth: cacheWidth,
78+
cacheHeight: cacheHeight,
79+
);
80+
}
81+
82+
ImageProvider provider({
83+
AssetBundle? bundle,
84+
${isPackage ? deprecationMessagePackage : ''}
85+
String? package$packageParameter,
86+
}) {
87+
return AssetImage(
88+
_assetName,
89+
bundle: bundle,
90+
package: package,
91+
);
92+
}
93+
94+
String get path => _assetName;
95+
96+
String get keyName => $keyName;
97+
}
98+
''';
99+
100+
@override
101+
String get className => 'AssetGenImage';
102+
103+
@override
104+
String classInstantiate(String path) => 'AssetGenImage(\'$path\')';
105+
106+
@override
107+
bool isSupport(AssetType type) {
108+
/// Flutter official supported image types. See
109+
/// https://api.flutter.dev/flutter/widgets/Image-class.html
110+
switch (type.mime) {
111+
case 'image/jpeg':
112+
case 'image/png':
113+
case 'image/gif':
114+
case 'image/bmp':
115+
case 'image/vnd.wap.wbmp':
116+
case 'image/webp':
117+
return true;
118+
default:
119+
return false;
120+
}
121+
}
122+
123+
@override
124+
bool get isConstConstructor => true;
125+
}

packages/core/lib/generators/integrations/integration.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import 'package:flutter_gen_core/settings/asset_type.dart';
22

3+
/// A base class for all integrations. An integration is a class that
4+
/// generates code for a specific asset type.
35
abstract class Integration {
4-
Integration(this.packageParameterLiteral);
6+
Integration(this.packageName);
57

6-
final String packageParameterLiteral;
7-
late final bool isPackage = packageParameterLiteral.isNotEmpty;
8+
/// The package name for this asset. If empty, the asset is not in a package.
9+
final String packageName;
10+
late final bool isPackage = packageName.isNotEmpty;
811

912
bool isEnabled = false;
1013

@@ -16,6 +19,7 @@ abstract class Integration {
1619

1720
String classInstantiate(String path);
1821

22+
/// Is this asset type supported by this integration?
1923
bool isSupport(AssetType type);
2024

2125
bool get isConstConstructor;

packages/core/lib/generators/integrations/lottie_integration.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import 'package:path/path.dart' as p;
77
import 'package:pub_semver/pub_semver.dart';
88

99
class LottieIntegration extends Integration {
10-
LottieIntegration(String packageParameterLiteral)
11-
: super(packageParameterLiteral);
10+
LottieIntegration(String packageName) : super(packageName);
1211

1312
// These are required keys for this integration.
1413
static const lottieKeys = [
@@ -25,6 +24,7 @@ class LottieIntegration extends Integration {
2524

2625
@override
2726
List<String> get requiredImports => [
27+
'package:flutter/widgets.dart',
2828
'package:lottie/lottie.dart',
2929
];
3030

@@ -35,7 +35,7 @@ class LottieIntegration extends Integration {
3535
const LottieGenImage(this._assetName);
3636
3737
final String _assetName;
38-
${isPackage ? "\n static const String package = '$packageParameterLiteral';" : ''}
38+
${isPackage ? "\n static const String package = '$packageName';" : ''}
3939
4040
LottieBuilder lottie({
4141
Animation<double>? controller,
@@ -89,7 +89,7 @@ ${isPackage ? "\n static const String package = '$packageParameterLiteral';" :
8989
9090
String get path => _assetName;
9191
92-
String get keyName => ${isPackage ? '\'packages/$packageParameterLiteral/\$_assetName\'' : '_assetName'};
92+
String get keyName => ${isPackage ? '\'packages/$packageName/\$_assetName\'' : '_assetName'};
9393
}''';
9494

9595
@override

packages/core/lib/generators/integrations/rive_integration.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import 'package:flutter_gen_core/generators/integrations/integration.dart';
22
import 'package:flutter_gen_core/settings/asset_type.dart';
33

44
class RiveIntegration extends Integration {
5-
RiveIntegration(String packageParameterLiteral)
6-
: super(packageParameterLiteral);
5+
RiveIntegration(String packageName) : super(packageName);
76

8-
String? get packageExpression =>
9-
isPackage ? 'packages/$packageParameterLiteral/' : null;
7+
String? get packageExpression => isPackage ? 'packages/$packageName/' : null;
108

119
@override
1210
List<String> get requiredImports => [
11+
'package:flutter/widgets.dart',
1312
'package:rive/rive.dart',
1413
];
1514

@@ -20,7 +19,7 @@ class RiveIntegration extends Integration {
2019
const RiveGenImage(this._assetName);
2120
2221
final String _assetName;
23-
${isPackage ? "\n static const String package = '$packageParameterLiteral';" : ''}
22+
${isPackage ? "\n static const String package = '$packageName';" : ''}
2423
2524
RiveAnimation rive({
2625
String? artboard,

0 commit comments

Comments
 (0)