generateRoutes method

String generateRoutes(
  1. String parent, [
  2. String parentTemplate = ''
])

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
],
),
''';
}