generateRoutes method
Implementation
String generateRoutes(
String parent, [
String parentTemplate = '',
]) {
final pathParams = findPathParameters(path);
final getPathParams = pathParams.isEmpty
? ''
: pathParams
.map((p) => "final $p = state.pathParameters['$p'];")
.join('\n');
final savePagePathParams = pathParams.isEmpty || pageWidget.isEmpty
? ''
: '''
$getPathParams
hypenPathParameterMap[$pageWidget] = ${pageWidget}PathParameters(
${pathParams.map((p) => '$p: $p!').join(',')}
);
''';
final saveLayoutPathParams = pathParams.isEmpty || layoutWidget.isEmpty
? ''
: '''
$getPathParams
hypenPathParameterMap[$layoutWidget] = ${layoutWidget}PathParameters(
${pathParams.map((p) => '$p: $p!').join(',')}
);
''';
var relativePath = path.substring(parent.length);
if (parent.isNotEmpty && relativePath.startsWith('/')) {
relativePath = relativePath.substring(1);
}
children.sort(
(a, b) {
if (a.path == path) {
return -1;
}
if (b.path == path) {
return 1;
}
return b.path.compareTo(a.path);
},
);
final routeParentNavigatorKey =
isFullScreenPage ? 'parentNavigatorKey: rootRouterKey,' : '';
var nextTemplate = layoutWidget.isEmpty ? parentTemplate : r'$child';
if (isFullScreenLayout || isFullScreenPage || nextTemplate.isEmpty) {
nextTemplate = r'$child';
}
if (templateWidget.isNotEmpty) {
nextTemplate = nextTemplate.replaceAll(
r'$child',
'''
$templateWidget(
child: \$child,
)
''',
);
}
final buildPage = nextTemplate.replaceAll(
r'$child',
'$pageWidget()',
);
final page = pageWidget.isEmpty
? children.map((c) => c.generateRoutes(parent, nextTemplate)).join('\n')
: '''
GoRoute(
$routeParentNavigatorKey
path: '$relativePath',
redirect: (context, state) {
final save = (context
.findAncestorStateOfType<SaveWidgetState>()!
.context) as WatchState;
$savePagePathParams
return $pageWidget().redirect(context, save);
},
onExit: (context) {
final save = (context
.findAncestorStateOfType<SaveWidgetState>()!
.context) as WatchState;
return $pageWidget().onExit(context, save);
},
${pageCustomTransition.isEmpty ? '''
builder: (context, state) {
$savePagePathParams
return $buildPage;
},
''' : '''
pageBuilder: (context, state) {
final save = (context
.findAncestorStateOfType<SaveWidgetState>()!
.context) as WatchState;
$savePagePathParams
return $pageCustomTransition().build(
context,
state,
$buildPage,
save,
);
},
'''}
routes: [
${children.map((c) => c.generateRoutes(path, nextTemplate)).join('\n')}
],
),
''';
if (layoutWidget.isEmpty) {
return page;
}
var layoutTemplate = parentTemplate;
if (layoutTemplate.isEmpty) {
layoutTemplate = r'$child';
}
var buildLayout = layoutTemplate.replaceAll(
r'$child',
'''
$layoutWidget(
child: child,
)
''',
);
return '''
ShellRoute(
parentNavigatorKey: ${isFullScreenLayout ? 'rootRouterKey' : 'null'},
navigatorKey: ${layoutWidget.toVariableName()}Key,
${layoutCustomTransition.isEmpty ? '''
builder: (context, state, child) {
$saveLayoutPathParams
return $buildLayout;
},
''' : '''
pageBuilder: (context, state, child) {
final save = (context
.findAncestorStateOfType<SaveWidgetState>()!
.context) as WatchState;
$saveLayoutPathParams
return $layoutCustomTransition().build(
context,
state,
$buildLayout,
save,
);
},
'''}
routes: [
$page
],
),
''';
}