Skip to content

Commit f4f4294

Browse files
committed
draft
1 parent 2fa5eb0 commit f4f4294

File tree

9 files changed

+88
-66
lines changed

9 files changed

+88
-66
lines changed

example/lib/freezed_sample.freezed.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ class _$Data with DiagnosticableTreeMixin implements Data {
216216
abstract class Data implements Union {
217217
const factory Data(final int value) = _$Data;
218218

219-
int get value => throw _privateConstructorUsedError;
219+
int get value;
220220
@JsonKey(ignore: true)
221221
_$$DataCopyWith<_$Data> get copyWith => throw _privateConstructorUsedError;
222222
}
@@ -476,7 +476,7 @@ class _$ErrorDetails with DiagnosticableTreeMixin implements ErrorDetails {
476476
abstract class ErrorDetails implements Union {
477477
const factory ErrorDetails([final String? message]) = _$ErrorDetails;
478478

479-
String? get message => throw _privateConstructorUsedError;
479+
String? get message;
480480
@JsonKey(ignore: true)
481481
_$$ErrorDetailsCopyWith<_$ErrorDetails> get copyWith =>
482482
throw _privateConstructorUsedError;

example/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ dependencies:
4141
local_auth: 2.0.1
4242
flutter_hooks: 0.18.3
4343
hooks_riverpod: 1.0.3
44-
async: 2.8.2
4544
dio: 4.0.6
4645
connectivity_plus: 2.3.0
4746
ua_client_hints: 1.1.0
@@ -51,7 +50,7 @@ dependencies:
5150
protobuf: 2.0.1
5251
json_serializable: 6.2.0
5352
json_annotation: ^4.5.0
54-
freezed_annotation: 2.0.1
53+
freezed_annotation: ^2.1.0
5554
intl: 0.17.0
5655
fixnum: 1.0.0
5756
shared_preferences: 2.0.13
@@ -107,6 +106,7 @@ dev_dependencies:
107106
integration_test:
108107
sdk: flutter
109108
build_runner: ^2.1.11
109+
freezed: ^2.1.0+1
110110
flutter_gen_runner: ^4.3.0
111111

112112
flutter_lints: ^2.0.1

packages/core/lib/flutter_generator.dart

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ import 'generators/assets_generator.dart';
77
import 'generators/colors_generator.dart';
88
import 'generators/fonts_generator.dart';
99
import 'settings/config.dart';
10-
import 'utils/error.dart';
1110
import 'utils/file.dart';
1211

1312
class FlutterGenerator {
14-
const FlutterGenerator(
13+
FlutterGenerator(
1514
this.pubspecFile, {
1615
this.assetsName = 'assets.gen.dart',
1716
this.colorsName = 'colors.gen.dart',
@@ -23,32 +22,25 @@ class FlutterGenerator {
2322
final String colorsName;
2423
final String fontsName;
2524

26-
Future<Config?> getConfig() async {
27-
Config config;
28-
29-
try {
30-
config = await loadPubspecConfig(pubspecFile);
31-
} on InvalidSettingsException catch (e) {
32-
stderr.writeln(e.message);
33-
return null;
34-
} on FileSystemException catch (e) {
35-
stderr.writeln(e.message);
36-
return null;
37-
}
38-
39-
return config;
40-
}
41-
42-
Future<void> build({Config? config}) async {
43-
config ??= await getConfig();
44-
if (config == null) return;
25+
Future<void> build({Config? config, FileWriter? writer}) async {
26+
config ??= loadPubspecConfig(pubspecFile);
4527

4628
final flutter = config.pubspec.flutter;
4729
final flutterGen = config.pubspec.flutterGen;
4830
final output = config.pubspec.flutterGen.output;
4931
final lineLength = config.pubspec.flutterGen.lineLength;
5032
final formatter = DartFormatter(pageWidth: lineLength, lineEnding: '\n');
5133

34+
void defaultWriter(String contents, String path) {
35+
final file = File(path);
36+
if (!file.existsSync()) {
37+
file.createSync(recursive: true);
38+
}
39+
file.writeAsStringSync(contents);
40+
}
41+
42+
writer ??= defaultWriter;
43+
5244
final absoluteOutput =
5345
Directory(normalize(join(pubspecFile.parent.path, output)));
5446
if (!absoluteOutput.existsSync()) {
@@ -58,29 +50,29 @@ class FlutterGenerator {
5850
if (flutterGen.colors.enabled && flutterGen.colors.inputs.isNotEmpty) {
5951
final generated =
6052
generateColors(pubspecFile, formatter, flutterGen.colors);
61-
final colors =
62-
File(normalize(join(pubspecFile.parent.path, output, colorsName)));
63-
writeAsString(generated, file: colors);
64-
stdout.writeln('Generated: ${colors.absolute.path}');
53+
final colorsPath =
54+
normalize(join(pubspecFile.parent.path, output, colorsName));
55+
writer(generated, colorsPath);
56+
stdout.writeln('Generated: $colorsPath');
6557
}
6658

6759
if (flutterGen.assets.enabled && flutter.assets.isNotEmpty) {
6860
final generated = generateAssets(
6961
AssetsGenConfig.fromConfig(pubspecFile, config),
7062
formatter,
7163
);
72-
final assets =
73-
File(normalize(join(pubspecFile.parent.path, output, assetsName)));
74-
writeAsString(generated, file: assets);
75-
stdout.writeln('Generated: ${assets.absolute.path}');
64+
final assetsPath =
65+
normalize(join(pubspecFile.parent.path, output, assetsName));
66+
writer(generated, assetsPath);
67+
stdout.writeln('Generated: $assetsPath');
7668
}
7769

7870
if (flutterGen.fonts.enabled && flutter.fonts.isNotEmpty) {
7971
final generated = generateFonts(formatter, flutter.fonts);
80-
final fonts =
81-
File(normalize(join(pubspecFile.parent.path, output, fontsName)));
82-
writeAsString(generated, file: fonts);
83-
stdout.writeln('Generated: ${fonts.absolute.path}');
72+
final fontsPath =
73+
normalize(join(pubspecFile.parent.path, output, fontsName));
74+
writer(generated, fontsPath);
75+
stdout.writeln('Generated: $fontsPath');
8476
}
8577

8678
stdout.writeln('FlutterGen finished.');

packages/core/lib/settings/config.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@ class Config {
1414
final File pubspecFile;
1515
}
1616

17-
Future<Config> loadPubspecConfig(File pubspecFile) async {
17+
Config loadPubspecConfig(File pubspecFile) {
1818
stdout.writeln('$flutterGenVersion Loading ... '
1919
'${normalize(join(
2020
basename(pubspecFile.parent.path),
2121
basename(pubspecFile.path),
2222
))}');
23-
final content = await pubspecFile.readAsString().catchError((dynamic error) {
23+
final String content;
24+
try {
25+
content = pubspecFile.readAsStringSync();
26+
} catch (e) {
2427
throw FileSystemException(
2528
'Cannot open pubspec.yaml: ${pubspecFile.absolute}');
26-
});
29+
}
2730
final userMap = loadYaml(content) as Map?;
2831
final defaultMap = loadYaml(_defaultConfig) as Map?;
2932
final mergedMap = mergeMap([defaultMap, userMap]);

packages/core/lib/utils/file.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1 @@
1-
import 'dart:io';
2-
3-
void writeAsString(String text, {required File file}) {
4-
if (!file.existsSync()) {
5-
file.createSync(recursive: true);
6-
}
7-
file.writeAsStringSync(text);
8-
}
1+
typedef FileWriter = void Function(String contents, String path);

packages/core/test/assets_gen_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void main() {
5555

5656
test('Assets with No lists on pubspec.yaml', () async {
5757
final pubspec = File('test_resources/pubspec_assets_no_list.yaml');
58-
final config = await loadPubspecConfig(pubspec);
58+
final config = loadPubspecConfig(pubspec);
5959
final formatter = DartFormatter(
6060
pageWidth: config.pubspec.flutterGen.lineLength, lineEnding: '\n');
6161

packages/runner/build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ builders:
88
flutter_gen_runner:
99
import: "package:flutter_gen_runner/flutter_gen_runner.dart"
1010
builder_factories: [ "build" ]
11-
build_extensions: { "$package$": [ ".gen.dart" ] }
11+
build_extensions: { "$package$": [ "lib/gen/assets.gen.dart", "lib/gen/colors.gen.dart" ] }
1212
auto_apply: dependents
1313
build_to: source

packages/runner/lib/flutter_gen_runner.dart

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,55 @@ import 'package:flutter_gen_core/flutter_generator.dart';
88
import 'package:flutter_gen_core/settings/config.dart';
99

1010
import 'package:glob/glob.dart';
11+
import 'package:path/path.dart';
1112

1213
Builder build(BuilderOptions options) => FlutterGenBuilder();
1314

1415
class FlutterGenBuilder extends Builder {
16+
static AssetId _output(BuildStep buildStep, String path) {
17+
return AssetId(
18+
buildStep.inputId.package,
19+
path,
20+
);
21+
}
22+
1523
final FlutterGenerator generator = FlutterGenerator(File('pubspec.yaml'));
24+
late final _config = loadPubspecConfig(generator.pubspecFile);
1625
_FlutterGenBuilderState? _currentState;
1726

1827
@override
1928
Future<void> build(BuildStep buildStep) async {
20-
final config = await generator.getConfig();
21-
if (config == null) return;
22-
23-
final state = await _createState(config, buildStep);
24-
if (_currentState != null && _currentState!.equals(state)) return;
29+
final state = await _createState(_config, buildStep);
30+
if (state.shouldSkipGenerate(_currentState)) return;
2531
_currentState = state;
2632

27-
await generator.build(config: config);
33+
await generator.build(
34+
config: _config,
35+
writer: (contents, path) {
36+
buildStep.writeAsString(_output(buildStep, path), contents);
37+
},
38+
);
2839
}
2940

3041
@override
31-
Map<String, List<String>> get buildExtensions => {
32-
"\$package\$": ['.gen.dart']
33-
};
42+
Map<String, List<String>> get buildExtensions {
43+
final ouput = _config.pubspec.flutterGen.output;
44+
final map = {
45+
r'$package$': [
46+
for (final name in [
47+
generator.assetsName,
48+
generator.colorsName,
49+
generator.fontsName
50+
])
51+
join(ouput, name),
52+
],
53+
};
54+
return map;
55+
}
3456

3557
Future<_FlutterGenBuilderState> _createState(
3658
Config config, BuildStep buildStep) async {
59+
print('aaa ${buildStep.inputId}');
3760
final pubspec = config.pubspec;
3861

3962
final HashSet<String> assets = HashSet();
@@ -63,7 +86,11 @@ class FlutterGenBuilder extends Builder {
6386

6487
final pubspecDigest = await buildStep.digest(pubspecAsset);
6588

66-
return _FlutterGenBuilderState(pubspecDigest, assets, colors);
89+
return _FlutterGenBuilderState(
90+
pubspecDigest: pubspecDigest,
91+
assets: assets,
92+
colors: colors,
93+
);
6794
}
6895
}
6996

@@ -72,11 +99,17 @@ class _FlutterGenBuilderState {
7299
final HashSet<String> assets;
73100
final HashMap<String, Digest> colors;
74101

75-
_FlutterGenBuilderState(this.pubspecDigest, this.assets, this.colors);
76-
77-
bool equals(_FlutterGenBuilderState state) {
78-
return pubspecDigest == state.pubspecDigest &&
79-
const SetEquality().equals(assets, state.assets) &&
80-
const MapEquality().equals(colors, state.colors);
102+
_FlutterGenBuilderState({
103+
required this.pubspecDigest,
104+
required this.assets,
105+
required this.colors,
106+
});
107+
108+
bool shouldSkipGenerate(_FlutterGenBuilderState? previous) {
109+
print('previous $previous');
110+
if (previous == null) return false;
111+
return pubspecDigest == previous.pubspecDigest &&
112+
const SetEquality().equals(assets, previous.assets) &&
113+
const MapEquality().equals(colors, previous.colors);
81114
}
82115
}

packages/runner/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ dependencies:
1616
collection: '>=1.15.0 <2.0.0'
1717
crypto: '>=3.0.0 <4.0.0'
1818
glob: '>=2.0.0 <3.0.0'
19+
path: '>=1.8.0 <2.0.0'
1920

2021
dev_dependencies:
2122
flutter_lints: '>=2.0.1 <3.0.0'

0 commit comments

Comments
 (0)