Skip to content

Commit 57b3475

Browse files
authored
fix: remove duplicate classes from nested routers (#28)
1 parent 7125a51 commit 57b3475

File tree

2 files changed

+52
-27
lines changed

2 files changed

+52
-27
lines changed

lib/src/generators/router/generator/arguments_class/arguments_class_builder.dart

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ class ArgumentsClassBuilder {
2323
(b) => b
2424
..name = argumentsBuilderHelper.argumentClassName
2525
..fields.addAll(argumentsBuilderHelper.convertParametersToClassFields)
26-
..constructors
27-
.add(argumentsBuilderHelper.argumentConstructer(emitter))
26+
..constructors.add(
27+
argumentsBuilderHelper.argumentConstructer(emitter),
28+
)
2829
..methods.addAll([
2930
Method(
3031
(b) => b
@@ -40,7 +41,8 @@ class ArgumentsClassBuilder {
4041
fields: argumentsBuilderHelper.convertParametersToClassFields,
4142
),
4243
_buildHashCode(
43-
argumentsBuilderHelper.convertParametersToClassFields),
44+
argumentsBuilderHelper.convertParametersToClassFields,
45+
),
4446
]),
4547
);
4648
});
@@ -50,30 +52,38 @@ class ArgumentsClassBuilder {
5052
Method _buildHashCode(List<Field> fields) {
5153
final buffer = StringBuffer();
5254
buffer.writeln(
53-
'return ${fields.map((f) => '${f.name}.hashCode').join(' ^ ')};');
55+
'return ${fields.map((f) => '${f.name}.hashCode').join(' ^ ')};',
56+
);
5457

55-
return Method((b) => b
56-
..name = 'hashCode'
57-
..returns = refer('int')
58-
..annotations.add(refer('override'))
59-
..type = MethodType.getter
60-
..body = Code(buffer.toString().trim()));
58+
return Method(
59+
(b) => b
60+
..name = 'hashCode'
61+
..returns = refer('int')
62+
..annotations.add(refer('override'))
63+
..type = MethodType.getter
64+
..body = Code(buffer.toString().trim()),
65+
);
6166
}
6267

63-
Method _buildEqualityOperator(
64-
{required String className, required List<Field> fields}) {
68+
Method _buildEqualityOperator({
69+
required String className,
70+
required List<Field> fields,
71+
}) {
6572
final buffer = StringBuffer();
6673
buffer.writeln('if (identical(this, other)) return $literalTrue;');
6774
buffer.writeln(
68-
'return ${fields.map((f) => 'other.${f.name} == ${f.name}').join(' && ')};');
75+
'return ${fields.map((f) => 'other.${f.name} == ${f.name}').join(' && ')};',
76+
);
6977

70-
return Method((b) => b
71-
..name = 'operator =='
72-
..returns = refer('bool')
73-
..annotations.add(refer('override'))
74-
..requiredParameters.add(Parameter((p) => p
75-
..covariant = true
76-
..name = 'other'
77-
..type = refer(className)))
78-
..body = Code(buffer.toString()));
78+
return Method(
79+
(b) => b
80+
..name = 'operator =='
81+
..returns = refer('bool')
82+
..annotations.add(refer('override'))
83+
..requiredParameters.add(Parameter((p) => p
84+
..covariant = true
85+
..name = 'other'
86+
..type = refer(className)))
87+
..body = Code(buffer.toString()),
88+
);
7989
}

lib/src/generators/router/generator/router_generator.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import 'package:dart_style/dart_style.dart';
33
import 'package:stacked_generator/src/generators/base_generator.dart';
44
import 'package:stacked_generator/src/generators/extensions/routes_extension.dart';
55
import 'package:stacked_generator/src/generators/router/generator/routes_class/routes_class_builder.dart';
6+
import 'package:stacked_generator/src/generators/router_common/models/router_config.dart';
67

7-
import '../../router_common/models/router_config.dart';
88
import 'arguments_class/arguments_class_builder.dart';
99
import 'navigate_extension_class/navigate_extension_class_builder.dart';
1010
import 'route_allocator.dart';
@@ -17,10 +17,13 @@ class RouterGenerator implements BaseGenerator {
1717

1818
/// Where we store the result of [_generateClasses]
1919
List<Spec> classes = [];
20+
2021
List<String> notAliasedImports = [];
22+
2123
@override
2224
String generate() {
2325
if (_rootRouterConfig.routes.isEmpty) return '';
26+
2427
final emitter = DartEmitter(
2528
allocator: RouteAllocator(),
2629
useNullSafetySyntax: true,
@@ -38,13 +41,25 @@ class RouterGenerator implements BaseGenerator {
3841
routes: _rootRouterConfig.routesIncludingTheirChildren,
3942
).build(emitter);
4043

44+
/// Remove duplicate classes from nested routers
45+
List<Class> parsedClasses = [];
46+
for (var c in classes) {
47+
if (c is! Class) continue;
48+
49+
if (parsedClasses.any((parsedClass) => parsedClass.name == c.name)) {
50+
continue;
51+
}
52+
53+
parsedClasses.add(c);
54+
}
55+
4156
final library = Library(
4257
(b) => b
4358
..directives.add(
4459
// No need to alias this import that's why we're adding it
4560
Directive.import('package:flutter/material.dart'),
4661
)
47-
..body.addAll([...classes, navigationExtensionClassBuilder]),
62+
..body.addAll([...parsedClasses, navigationExtensionClassBuilder]),
4863
);
4964

5065
return DartFormatter().format('${library.accept(emitter)}');
@@ -61,9 +76,9 @@ class RouterGenerator implements BaseGenerator {
6176
if (routerConfig.routes.isEmpty) return;
6277

6378
final routesClassBuilder = RoutesClassBuilder(
64-
routes: routerConfig.routes,
65-
routesClassName: routerConfig.routesClassName)
66-
.buildRoutesClass();
79+
routes: routerConfig.routes,
80+
routesClassName: routerConfig.routesClassName,
81+
).buildRoutesClass();
6782

6883
final routerClassBuilder = RouterClassBuilder(
6984
routesClassName: routerConfig.routesClassName,

0 commit comments

Comments
 (0)