route method

  1. @override
RouteBase route()
override

Creates the GoRoute for this navigable widget

Implementation

@override
RouteBase route() {
  late final List<NavTarget> navTargets;
  if (hookName != null) {
    // Get any navTarget anchors from the feature
    // registry and merge them with the predefined
    // navTargets from this class
    navTargets = List.from(this.navTargets);
    final navTargetAnchors =
        app.FeatureRegistry.instance().getAnchors<NavTarget>(
      hookName!,
    );
    navTargets.addAll(navTargetAnchors);
    navTargets.sort((a, b) => a._order.compareTo(b._order));
  } else {
    navTargets = this.navTargets;
  }
  assert(
    navTargets.length >= 2,
    'At least two nav targets are required',
  );

  return StatefulShellRoute.indexedStack(
    builder: (context, navState, navShell) {
      final navTitleBar = buildNavTitleBar(context);
      final navDests = navTargets
          .map(
            (navTarget) => navTarget._destBuilder(context),
          )
          .toList();

      return RootLayout<RootState>(
        body: NavLayout(
          navShell,
          navDests,
          titleBar: navTitleBar,
          navProperties: navProperties,
          buildNavTrailLeadingWidgetFn: buildNavTrailLeadingWidget,
          buildNavTrailTrailingWidgetFn: buildNavTrailTrailingWidget,
          buildNavDrawerHeaderWidgetFn: buildNavDrawerHeaderWidget,
        ),
        createRootState: () => RootState(),
      );
    },
    branches: navTargets.map((navTarget) {
      if (routeName == navTarget._body.routeName) {
        return StatefulShellBranch(
          navigatorKey: _shellNavigatorKey,
          routes: [
            navTarget._body.route(),
          ],
        );
      } else {
        return StatefulShellBranch(
          routes: [
            navTarget._body.route(),
          ],
        );
      }
    }).toList(),
  );
}