Skip to content

Commit ac2877c

Browse files
authored
Merge pull request #57 from FlutterGen/support-flare
Support Flare Flutter
2 parents 69dd134 + 476791a commit ac2877c

19 files changed

+572
-40
lines changed

example/lib/gen/assets.gen.dart

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import 'package:flutter/widgets.dart';
77
import 'package:flutter_svg/flutter_svg.dart';
88
import 'package:flutter/services.dart';
9+
import 'package:flare_flutter/flare_actor.dart';
10+
import 'package:flare_flutter/flare_controller.dart';
911

1012
class $PicturesGen {
1113
const $PicturesGen();
@@ -16,7 +18,7 @@ class $PicturesGen {
1618
class $AssetsFlareGen {
1719
const $AssetsFlareGen();
1820

19-
String get penguin => 'assets/flare/Penguin.flr';
21+
FlareGenImage get penguin => const FlareGenImage('assets/flare/Penguin.flr');
2022
}
2123

2224
class $AssetsImagesGen {
@@ -179,3 +181,44 @@ class SvgGenImage {
179181

180182
String get path => _assetName;
181183
}
184+
185+
class FlareGenImage {
186+
const FlareGenImage(this._assetName);
187+
188+
final String _assetName;
189+
190+
FlareActor flare({
191+
String boundsNode,
192+
String animation,
193+
BoxFit fit = BoxFit.contain,
194+
Alignment alignment = Alignment.center,
195+
bool isPaused = false,
196+
bool snapToEnd = false,
197+
FlareController controller,
198+
FlareCompletedCallback callback,
199+
Color color,
200+
bool shouldClip = true,
201+
bool sizeFromArtboard = false,
202+
String artboard,
203+
bool antialias = true,
204+
}) {
205+
return FlareActor(
206+
_assetName,
207+
boundsNode: boundsNode,
208+
animation: animation,
209+
fit: fit,
210+
alignment: alignment,
211+
isPaused: isPaused,
212+
snapToEnd: snapToEnd,
213+
controller: controller,
214+
callback: callback,
215+
color: color,
216+
shouldClip: shouldClip,
217+
sizeFromArtboard: sizeFromArtboard,
218+
artboard: artboard,
219+
antialias: antialias,
220+
);
221+
}
222+
223+
String get path => _assetName;
224+
}

example/lib/main.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:example/gen/assets.gen.dart';
22
import 'package:example/gen/colors.gen.dart';
33
import 'package:example/gen/fonts.gen.dart';
4-
import 'package:flare_flutter/flare_actor.dart';
54
import 'package:flutter/material.dart';
65
import 'package:flutter/widgets.dart';
76

@@ -26,8 +25,7 @@ void main() {
2625
Container(
2726
width: 200,
2827
height: 200,
29-
child: FlareActor(
30-
Assets.flare.penguin,
28+
child: Assets.flare.penguin.flare(
3129
animation: 'walk',
3230
fit: BoxFit.contain,
3331
),

example/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ flutter_gen:
2929

3030
integrations:
3131
flutter_svg: true
32+
flare_flutter: true
3233

3334
assets:
3435
# Assets.imagesChip

lib/src/generators/assets_generator.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:io';
33

44
import 'package:dart_style/dart_style.dart';
55
import 'package:dartx/dartx.dart';
6+
import 'package:flutter_gen/src/generators/integrations/flare_integration.dart';
67
import 'package:path/path.dart';
78

89
import '../settings/asset_type.dart';
@@ -29,10 +30,14 @@ String generateAssets(
2930
final classesBuffer = StringBuffer();
3031

3132
final integrations = <Integration>[];
32-
if (flutterGen != null &&
33-
flutterGen.hasIntegrations &&
34-
flutterGen.integrations.hasFlutterSvg) {
35-
integrations.add(SvgIntegration());
33+
if (flutterGen != null && flutterGen.hasIntegrations) {
34+
if (flutterGen.integrations.flutterSvg) {
35+
integrations.add(SvgIntegration());
36+
}
37+
38+
if (flutterGen.integrations.flareFlutter) {
39+
integrations.add(FlareIntegration());
40+
}
3641
}
3742

3843
if (flutterGen == null ||
@@ -139,7 +144,7 @@ _Statement _createAssetTypeStatement(
139144
);
140145
} else {
141146
final integration = integrations.firstWhere(
142-
(element) => element.mime == assetType.mime,
147+
(element) => element.isSupport(assetType),
143148
orElse: () => null,
144149
);
145150
if (integration == null) {
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import '../../settings/asset_type.dart';
2+
import 'integration.dart';
3+
4+
class FlareIntegration extends Integration {
5+
@override
6+
List<String> get requiredImports => [
7+
'package:flare_flutter/flare_actor.dart',
8+
'package:flare_flutter/flare_controller.dart',
9+
];
10+
11+
@override
12+
String get classOutput => '''class FlareGenImage {
13+
const FlareGenImage(this._assetName);
14+
15+
final String _assetName;
16+
17+
FlareActor flare({
18+
String boundsNode,
19+
String animation,
20+
BoxFit fit = BoxFit.contain,
21+
Alignment alignment = Alignment.center,
22+
bool isPaused = false,
23+
bool snapToEnd = false,
24+
FlareController controller,
25+
FlareCompletedCallback callback,
26+
Color color,
27+
bool shouldClip = true,
28+
bool sizeFromArtboard = false,
29+
String artboard,
30+
bool antialias = true,
31+
}) {
32+
return FlareActor(
33+
_assetName,
34+
boundsNode: boundsNode,
35+
animation: animation,
36+
fit: fit,
37+
alignment: alignment,
38+
isPaused: isPaused,
39+
snapToEnd: snapToEnd,
40+
controller: controller,
41+
callback: callback,
42+
color: color,
43+
shouldClip: shouldClip,
44+
sizeFromArtboard: sizeFromArtboard,
45+
artboard: artboard,
46+
antialias: antialias,
47+
);
48+
}
49+
50+
String get path => _assetName;
51+
}''';
52+
53+
@override
54+
String get className => 'FlareGenImage';
55+
56+
@override
57+
String classInstantiate(String path) => 'FlareGenImage\(\'$path\'\)';
58+
59+
@override
60+
bool isSupport(AssetType type) => type.extension == '.flr';
61+
62+
@override
63+
bool get isConstConstructor => true;
64+
}

lib/src/generators/integrations/integration.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import '../../settings/asset_type.dart';
2+
13
abstract class Integration {
24
bool isEnabled = false;
35

@@ -9,7 +11,7 @@ abstract class Integration {
911

1012
String classInstantiate(String path);
1113

12-
String get mime;
14+
bool isSupport(AssetType type);
1315

1416
bool get isConstConstructor;
1517
}

lib/src/generators/integrations/svg_integration.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import '../../settings/asset_type.dart';
12
import 'integration.dart';
23

34
class SvgIntegration extends Integration {
@@ -60,7 +61,7 @@ class SvgIntegration extends Integration {
6061
String classInstantiate(String path) => 'SvgGenImage\(\'$path\'\)';
6162

6263
@override
63-
String get mime => 'image/svg+xml';
64+
bool isSupport(AssetType type) => type.mime == 'image/svg+xml';
6465

6566
@override
6667
bool get isConstConstructor => true;

lib/src/settings/asset_type.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import 'package:mime/mime.dart';
2-
import 'package:path/path.dart';
31
import 'package:dartx/dartx.dart';
2+
import 'package:mime/mime.dart';
3+
import 'package:path/path.dart' as p;
44

55
/// https://github.com/dart-lang/mime/blob/master/lib/src/default_extension_map.dart
66
class AssetType {
@@ -31,7 +31,9 @@ class AssetType {
3131

3232
bool get isUnKnownMime => mime == null;
3333

34-
String get baseName => basenameWithoutExtension(path);
34+
String get extension => p.extension(path);
35+
36+
String get baseName => p.basenameWithoutExtension(path);
3537

3638
List<AssetType> get children => _children.sortedBy((e) => e.path);
3739

lib/src/settings/flutter_gen.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,14 @@ class FlutterGenIntegrations {
8585
FlutterGenIntegrations(YamlMap flutterGenMap) {
8686
if (flutterGenMap != null) {
8787
_flutterSvg = safeCast<bool>(flutterGenMap['flutter_svg']);
88+
_flareFlutter = safeCast<bool>(flutterGenMap['flare_flutter']);
8889
}
8990
}
9091

9192
bool _flutterSvg;
93+
bool _flareFlutter;
9294

9395
bool get flutterSvg => _flutterSvg ?? false;
9496

95-
bool get hasFlutterSvg => flutterSvg;
97+
bool get flareFlutter => _flareFlutter ?? false;
9698
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
@TestOn('vm')
2+
import 'dart:io';
3+
4+
import 'package:dart_style/dart_style.dart';
5+
import 'package:flutter_gen/src/flutter_generator.dart';
6+
import 'package:flutter_gen/src/generators/assets_generator.dart';
7+
import 'package:flutter_gen/src/generators/integrations/flare_integration.dart';
8+
import 'package:flutter_gen/src/generators/integrations/svg_integration.dart';
9+
import 'package:flutter_gen/src/settings/asset_type.dart';
10+
import 'package:flutter_gen/src/settings/config.dart';
11+
import 'package:test/test.dart';
12+
13+
void main() {
14+
setUp(() {
15+
final dir = Directory('test_resources/lib/gen/assets.gen.dart');
16+
17+
if (dir.existsSync()) {
18+
dir.deleteSync(recursive: true);
19+
}
20+
});
21+
22+
test('Assets with No integrations on pubspec.yaml', () async {
23+
await FlutterGenerator(
24+
File('test_resources/pubspec_assets_no_integrations.yaml'))
25+
.build();
26+
expect(
27+
File('test_resources/lib/gen/assets.gen.dart').readAsStringSync(),
28+
isNotEmpty,
29+
);
30+
31+
final pubspec = File('test_resources/pubspec_assets_no_integrations.yaml');
32+
final config = await Config(pubspec).load();
33+
final formatter = DartFormatter(
34+
pageWidth: config.flutterGen.lineLength, lineEnding: '\n');
35+
36+
final actual = generateAssets(
37+
pubspec, formatter, config.flutterGen, config.flutter.assets);
38+
final expected =
39+
File('test_resources/actual_data/assets_no_integrations.gen.dart')
40+
.readAsStringSync()
41+
.replaceAll('\r\n', '\n');
42+
43+
expect(actual, expected);
44+
});
45+
46+
test('Assets with Svg integrations on pubspec.yaml', () async {
47+
await FlutterGenerator(
48+
File('test_resources/pubspec_assets_svg_integrations.yaml'))
49+
.build();
50+
expect(
51+
File('test_resources/lib/gen/assets.gen.dart').readAsStringSync(),
52+
isNotEmpty,
53+
);
54+
55+
final pubspec = File('test_resources/pubspec_assets_svg_integrations.yaml');
56+
final config = await Config(pubspec).load();
57+
final formatter = DartFormatter(
58+
pageWidth: config.flutterGen.lineLength, lineEnding: '\n');
59+
60+
final actual = generateAssets(
61+
pubspec, formatter, config.flutterGen, config.flutter.assets);
62+
final expected =
63+
File('test_resources/actual_data/assets_svg_integrations.gen.dart')
64+
.readAsStringSync()
65+
.replaceAll('\r\n', '\n');
66+
67+
expect(actual, expected);
68+
69+
final integration = SvgIntegration();
70+
expect(integration.className, 'SvgGenImage');
71+
expect(integration.classInstantiate('assets/path'),
72+
'SvgGenImage\(\'assets/path\'\)');
73+
expect(integration.isSupport(AssetType('assets/path/dog.svg')), isTrue);
74+
expect(integration.isSupport(AssetType('assets/path/dog.png')), isFalse);
75+
expect(integration.isConstConstructor, isTrue);
76+
});
77+
78+
test('Assets with Flare integrations on pubspec.yaml', () async {
79+
await FlutterGenerator(
80+
File('test_resources/pubspec_assets_flare_integrations.yaml'))
81+
.build();
82+
expect(
83+
File('test_resources/lib/gen/assets.gen.dart').readAsStringSync(),
84+
isNotEmpty,
85+
);
86+
87+
final pubspec =
88+
File('test_resources/pubspec_assets_flare_integrations.yaml');
89+
final config = await Config(pubspec).load();
90+
final formatter = DartFormatter(
91+
pageWidth: config.flutterGen.lineLength, lineEnding: '\n');
92+
93+
final actual = generateAssets(
94+
pubspec, formatter, config.flutterGen, config.flutter.assets);
95+
final expected =
96+
File('test_resources/actual_data/assets_flare_integrations.gen.dart')
97+
.readAsStringSync()
98+
.replaceAll('\r\n', '\n');
99+
100+
expect(actual, expected);
101+
102+
final integration = FlareIntegration();
103+
expect(integration.className, 'FlareGenImage');
104+
expect(integration.classInstantiate('assets/path'),
105+
'FlareGenImage\(\'assets/path\'\)');
106+
expect(integration.isSupport(AssetType('assets/path/dog.flr')), isTrue);
107+
expect(integration.isSupport(AssetType('assets/path/dog.json')), isFalse);
108+
expect(integration.isConstConstructor, isTrue);
109+
});
110+
}

0 commit comments

Comments
 (0)