Skip to content

Commit 51c82d7

Browse files
authored
Support for adding assets from a package (#98)
* Support generate package name for AssetGenImage, SvgGenImage. * Stop generating package field
1 parent cfeab48 commit 51c82d7

24 files changed

+128
-94
lines changed

example/lib/gen/assets.gen.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Assets {
9393
class AssetGenImage extends AssetImage {
9494
const AssetGenImage(String assetName)
9595
: _assetName = assetName,
96-
super(assetName);
96+
super(assetName, package: 'example');
9797
final String _assetName;
9898

9999
Image image({
@@ -151,7 +151,7 @@ class SvgGenImage {
151151
Key? key,
152152
bool matchTextDirection = false,
153153
AssetBundle? bundle,
154-
String? package,
154+
String? package = 'example',
155155
double? width,
156156
double? height,
157157
BoxFit fit = BoxFit.contain,

example/pubspec.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,9 @@ packages:
219219
flutter_gen_core:
220220
dependency: transitive
221221
description:
222-
path: "../packages/core"
223-
relative: true
224-
source: path
222+
name: flutter_gen_core
223+
url: "https://pub.dartlang.org"
224+
source: hosted
225225
version: "3.0.2"
226226
flutter_gen_runner:
227227
dependency: "direct dev"

packages/command/pubspec.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ packages:
102102
flutter_gen_core:
103103
dependency: "direct main"
104104
description:
105-
name: flutter_gen_core
106-
url: "https://pub.dartlang.org"
107-
source: hosted
105+
path: "../core"
106+
relative: true
107+
source: path
108108
version: "3.0.2"
109109
glob:
110110
dependency: transitive

packages/command/pubspec.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ dependencies:
2323
dev_dependencies:
2424
effective_dart: '>=1.3.0 <2.0.0'
2525

26+
dependency_overrides:
27+
flutter_gen_core:
28+
path: ../core

packages/core/lib/flutter_generator.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class FlutterGenerator {
3737

3838
final output = config.flutterGen.output;
3939
final lineLength = config.flutterGen.lineLength;
40-
final nullSafety = config.flutterGen.nullSafety;
4140
final formatter = DartFormatter(pageWidth: lineLength, lineEnding: '\n');
4241

4342
final absoluteOutput =
@@ -58,8 +57,9 @@ class FlutterGenerator {
5857

5958
if (config.flutterGen.assets.enabled && config.flutter.assets.isNotEmpty) {
6059
final generated = generateAssets(
61-
pubspecFile, formatter, config.flutterGen, config.flutter.assets,
62-
nullSafety: nullSafety);
60+
AssetsGenConfig.fromConfig(pubspecFile, config),
61+
formatter,
62+
);
6363
final assets =
6464
File(normalize(join(pubspecFile.parent.path, output, assetsName)));
6565
writeAsString(generated, file: assets);

packages/core/lib/generators/assets_generator.dart

Lines changed: 65 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:dartx/dartx.dart';
66
import 'package:path/path.dart';
77

88
import '../settings/asset_type.dart';
9+
import '../settings/config.dart';
910
import '../settings/pubspec.dart';
1011
import '../utils/dart_style/dart_style.dart';
1112
import '../utils/error.dart';
@@ -15,17 +16,34 @@ import 'integrations/flare_integration.dart';
1516
import 'integrations/integration.dart';
1617
import 'integrations/svg_integration.dart';
1718

19+
class AssetsGenConfig {
20+
AssetsGenConfig._(
21+
this.rootPath,
22+
this.packageName,
23+
this.flutterGen,
24+
this.assets,
25+
);
26+
27+
factory AssetsGenConfig.fromConfig(File pubspecFile, Config config) {
28+
return AssetsGenConfig._(
29+
pubspecFile.parent.path,
30+
config.pubspec.packageName,
31+
config.pubspec.flutterGen,
32+
config.pubspec.flutter.assets,
33+
);
34+
}
35+
36+
final String rootPath;
37+
final String packageName;
38+
final FlutterGen flutterGen;
39+
final List<String> assets;
40+
}
41+
1842
String generateAssets(
19-
File pubspecFile,
43+
AssetsGenConfig config,
2044
DartFormatter formatter,
21-
FlutterGen flutterGen,
22-
List<String> assets, {
23-
24-
// TODO: Until null safety generalizes
25-
// ignore: type_annotate_public_apis
26-
nullSafety = true,
27-
}) {
28-
if (assets.isEmpty) {
45+
) {
46+
if (config.assets.isEmpty) {
2947
throw InvalidSettingsException(
3048
'The value of "flutter/assets:" is incorrect.');
3149
}
@@ -35,30 +53,29 @@ String generateAssets(
3553

3654
final integrations = <Integration>[
3755
// TODO: Until null safety generalizes
38-
if (flutterGen.integrations.flutterSvg)
39-
SvgIntegration(nullSafety: nullSafety),
40-
if (flutterGen.integrations.flareFlutter)
41-
FlareIntegration(nullSafety: nullSafety),
56+
if (config.flutterGen.integrations.flutterSvg)
57+
SvgIntegration(config.packageName,
58+
nullSafety: config.flutterGen.nullSafety),
59+
if (config.flutterGen.integrations.flareFlutter)
60+
FlareIntegration(nullSafety: config.flutterGen.nullSafety),
4261
];
4362

44-
if (flutterGen.assets.isDotDelimiterStyle) {
45-
classesBuffer.writeln(
46-
_dotDelimiterStyleDefinition(pubspecFile, assets, integrations));
47-
} else if (flutterGen.assets.isSnakeCaseStyle) {
48-
classesBuffer
49-
.writeln(_snakeCaseStyleDefinition(pubspecFile, assets, integrations));
50-
} else if (flutterGen.assets.isCamelCaseStyle) {
51-
classesBuffer
52-
.writeln(_camelCaseStyleDefinition(pubspecFile, assets, integrations));
63+
if (config.flutterGen.assets.isDotDelimiterStyle) {
64+
classesBuffer.writeln(_dotDelimiterStyleDefinition(config, integrations));
65+
} else if (config.flutterGen.assets.isSnakeCaseStyle) {
66+
classesBuffer.writeln(_snakeCaseStyleDefinition(config, integrations));
67+
} else if (config.flutterGen.assets.isCamelCaseStyle) {
68+
classesBuffer.writeln(_camelCaseStyleDefinition(config, integrations));
5369
} else {
5470
throw 'The value of "flutter_gen/assets/style." is incorrect.';
5571
}
5672

5773
// TODO: Until null safety generalizes
58-
if (nullSafety) {
59-
classesBuffer.writeln(_assetGenImageClassDefinition);
74+
if (config.flutterGen.nullSafety) {
75+
classesBuffer.writeln(_assetGenImageClassDefinition(config.packageName));
6076
} else {
61-
classesBuffer.writeln(_assetGenImageClassDefinitionWithNoNullSafety);
77+
classesBuffer.writeln(
78+
_assetGenImageClassDefinitionWithNoNullSafety(config.packageName));
6279
}
6380

6481
final imports = <String>{'package:flutter/widgets.dart'};
@@ -75,7 +92,7 @@ String generateAssets(
7592
final buffer = StringBuffer();
7693

7794
// TODO: Until null safety generalizes
78-
if (nullSafety) {
95+
if (config.flutterGen.nullSafety) {
7996
buffer.writeln(header);
8097
} else {
8198
buffer.writeln(headerWithNoNullSafety);
@@ -86,21 +103,20 @@ String generateAssets(
86103
}
87104

88105
List<String> _getAssetRelativePathList(
89-
File pubspecFile,
106+
String rootPath,
90107
List<String> assets,
91108
) {
92109
final assetRelativePathList = <String>[];
93110
for (final assetName in assets) {
94-
final assetAbsolutePath = join(pubspecFile.parent.path, assetName);
111+
final assetAbsolutePath = join(rootPath, assetName);
95112
if (FileSystemEntity.isDirectorySync(assetAbsolutePath)) {
96113
assetRelativePathList.addAll(Directory(assetAbsolutePath)
97114
.listSync()
98115
.whereType<File>()
99-
.map((e) => relative(e.path, from: pubspecFile.parent.path))
116+
.map((e) => relative(e.path, from: rootPath))
100117
.toList());
101118
} else if (FileSystemEntity.isFileSync(assetAbsolutePath)) {
102-
assetRelativePathList
103-
.add(relative(assetAbsolutePath, from: pubspecFile.parent.path));
119+
assetRelativePathList.add(relative(assetAbsolutePath, from: rootPath));
104120
}
105121
}
106122
return assetRelativePathList;
@@ -130,12 +146,12 @@ AssetType _constructAssetTree(List<String> assetRelativePathList) {
130146
}
131147

132148
_Statement? _createAssetTypeStatement(
133-
File pubspecFile,
149+
String rootPath,
134150
AssetType assetType,
135151
List<Integration> integrations,
136152
String name,
137153
) {
138-
final childAssetAbsolutePath = join(pubspecFile.parent.path, assetType.path);
154+
final childAssetAbsolutePath = join(rootPath, assetType.path);
139155
if (assetType.isSupportedImage) {
140156
return _Statement(
141157
type: 'AssetGenImage',
@@ -176,27 +192,27 @@ _Statement? _createAssetTypeStatement(
176192

177193
/// Generate style like Assets.foo.bar
178194
String _dotDelimiterStyleDefinition(
179-
File pubspecFile,
180-
List<String> assets,
195+
AssetsGenConfig config,
181196
List<Integration> integrations,
182197
) {
183198
final buffer = StringBuffer();
184-
final assetRelativePathList = _getAssetRelativePathList(pubspecFile, assets);
199+
final assetRelativePathList =
200+
_getAssetRelativePathList(config.rootPath, config.assets);
185201
final assetsStaticStatements = <_Statement>[];
186202

187203
final assetTypeQueue = ListQueue<AssetType>.from(
188204
_constructAssetTree(assetRelativePathList).children);
189205

190206
while (assetTypeQueue.isNotEmpty) {
191207
final assetType = assetTypeQueue.removeFirst();
192-
final assetAbsolutePath = join(pubspecFile.parent.path, assetType.path);
208+
final assetAbsolutePath = join(config.rootPath, assetType.path);
193209

194210
if (FileSystemEntity.isDirectorySync(assetAbsolutePath)) {
195211
final statements = assetType.children
196212
.mapToIsUniqueWithoutExtension()
197213
.map(
198214
(e) => _createAssetTypeStatement(
199-
pubspecFile,
215+
config.rootPath,
200216
e.assetType,
201217
integrations,
202218
(e.isUniqueWithoutExtension
@@ -234,13 +250,11 @@ String _dotDelimiterStyleDefinition(
234250

235251
/// Generate style like Assets.fooBar
236252
String _camelCaseStyleDefinition(
237-
File pubspecFile,
238-
List<String> assets,
253+
AssetsGenConfig config,
239254
List<Integration> integrations,
240255
) {
241256
return _flatStyleDefinition(
242-
pubspecFile,
243-
assets,
257+
config,
244258
integrations,
245259
(e) => (e.isUniqueWithoutExtension
246260
? withoutExtension(e.assetType.path)
@@ -252,13 +266,11 @@ String _camelCaseStyleDefinition(
252266

253267
/// Generate style like Assets.foo_bar
254268
String _snakeCaseStyleDefinition(
255-
File pubspecFile,
256-
List<String> assets,
269+
AssetsGenConfig config,
257270
List<Integration> integrations,
258271
) {
259272
return _flatStyleDefinition(
260-
pubspecFile,
261-
assets,
273+
config,
262274
integrations,
263275
(e) => (e.isUniqueWithoutExtension
264276
? withoutExtension(e.assetType.path)
@@ -269,19 +281,18 @@ String _snakeCaseStyleDefinition(
269281
}
270282

271283
String _flatStyleDefinition(
272-
File pubspecFile,
273-
List<String> assets,
284+
AssetsGenConfig config,
274285
List<Integration> integrations,
275286
String Function(AssetTypeIsUniqueWithoutExtension) createName,
276287
) {
277-
final statements = _getAssetRelativePathList(pubspecFile, assets)
288+
final statements = _getAssetRelativePathList(config.rootPath, config.assets)
278289
.distinct()
279290
.sorted()
280291
.map((relativePath) => AssetType(relativePath))
281292
.mapToIsUniqueWithoutExtension()
282293
.map(
283294
(e) => _createAssetTypeStatement(
284-
pubspecFile,
295+
config.rootPath,
285296
e.assetType,
286297
integrations,
287298
createName(e),
@@ -322,12 +333,12 @@ class $className {
322333
}
323334

324335
/// Null Safety
325-
const String _assetGenImageClassDefinition = '''
336+
String _assetGenImageClassDefinition(String packageName) => '''
326337
327338
class AssetGenImage extends AssetImage {
328339
const AssetGenImage(String assetName)
329340
: _assetName = assetName,
330-
super(assetName);
341+
super(assetName, package: '$packageName');
331342
final String _assetName;
332343
333344
Image image({
@@ -379,12 +390,12 @@ class AssetGenImage extends AssetImage {
379390

380391
/// No Null Safety
381392
/// TODO: Until null safety generalizes
382-
const String _assetGenImageClassDefinitionWithNoNullSafety = '''
393+
String _assetGenImageClassDefinitionWithNoNullSafety(String packageName) => '''
383394
384395
class AssetGenImage extends AssetImage {
385396
const AssetGenImage(String assetName)
386397
: _assetName = assetName,
387-
super(assetName);
398+
super(assetName, package: '$packageName');
388399
final String _assetName;
389400
390401
Image image({

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import 'integration.dart';
44
class SvgIntegration extends Integration {
55
// TODO: Until null safety generalizes
66
// ignore: avoid_positional_boolean_parameters
7-
SvgIntegration({bool nullSafety = true}) : super(nullSafety: nullSafety);
7+
SvgIntegration(this._packageName, {bool nullSafety = true})
8+
: super(nullSafety: nullSafety);
9+
10+
final String _packageName;
811

912
@override
1013
List<String> get requiredImports => [
@@ -18,7 +21,7 @@ class SvgIntegration extends Integration {
1821
nullSafety ? _classDefinition : _classDefinitionWithNoNullSafety;
1922

2023
/// Null Safety
21-
final String _classDefinition = '''class SvgGenImage {
24+
String get _classDefinition => '''class SvgGenImage {
2225
const SvgGenImage(this._assetName);
2326
2427
final String _assetName;
@@ -27,7 +30,7 @@ class SvgIntegration extends Integration {
2730
Key? key,
2831
bool matchTextDirection = false,
2932
AssetBundle? bundle,
30-
String? package,
33+
String? package = '$_packageName',
3134
double? width,
3235
double? height,
3336
BoxFit fit = BoxFit.contain,
@@ -65,7 +68,7 @@ class SvgIntegration extends Integration {
6568

6669
/// No Null Safety
6770
/// TODO: Until null safety generalizes
68-
final String _classDefinitionWithNoNullSafety = '''class SvgGenImage {
71+
String get _classDefinitionWithNoNullSafety => '''class SvgGenImage {
6972
const SvgGenImage(this._assetName);
7073
7174
final String _assetName;
@@ -74,7 +77,7 @@ class SvgIntegration extends Integration {
7477
Key key,
7578
bool matchTextDirection = false,
7679
AssetBundle bundle,
77-
String package,
80+
String package = '$_packageName',
7881
double width,
7982
double height,
8083
BoxFit fit = BoxFit.contain,

0 commit comments

Comments
 (0)