generator method

RouteFactory generator()

Generates the RouteFactory which builds a Route on request.

These routes are built using the seafarerRoutes provided using addRoute method.

Implementation

RouteFactory generator() {
  return (settings) {
    final route = _routeNameMappings[settings.name!];

    if (route == null) return null;

    ArgumentsWrapper? argsWrapper = settings.arguments as ArgumentsWrapper?;

    // If for some reason the arguments passed themself are null.
    if (argsWrapper == null) {
      argsWrapper = ArgumentsWrapper();
    }

    final BaseArguments? baseArgs = argsWrapper.baseArguments;

    // Select which transitions to use.
    // Priority:
    //   1. Transitions provided when route is called.
    //   2. Default transitions when route was registered.
    //   3. Default transition from seafarerOptions.
    final List<SeafarerTransition> transitions = [];

    final bool areTransitionsProvidedInNavigate =
        argsWrapper.transitions != null &&
            argsWrapper.transitions!.isNotEmpty;
    final bool areTransitionsProvidedInRouteDeclaration =
        route.defaultTransitions != null &&
            route.defaultTransitions!.isNotEmpty;
    final bool areTransitionsProvidedInseafarerOptions =
        this.options.defaultTransitions != null;

    if (areTransitionsProvidedInNavigate) {
      transitions.addAll(argsWrapper.transitions!);
    } else if (areTransitionsProvidedInRouteDeclaration) {
      transitions.addAll(route.defaultTransitions!);
    } else if (areTransitionsProvidedInseafarerOptions) {
      transitions.addAll(this.options.defaultTransitions!);
    }

    final transitionDuration = argsWrapper.transitionDuration ??
        route.defaultTransitionDuration ??
        this.options.defaultTransitionDuration;

    final transitionCurve = argsWrapper.transitionCurve ??
        route.defaultTransitionCurve ??
        this.options.defaultTransitionCurve;

    final customTransition = argsWrapper.customTransition ??
        route.customTransition ??
        this.options.customTransition;

    bool shouldUseCustomTransition = customTransition != null;
    if (argsWrapper.customTransition != null) {
      shouldUseCustomTransition = true;
    } else if (areTransitionsProvidedInNavigate) {
      shouldUseCustomTransition = false;
    } else if (route.customTransition != null) {
      shouldUseCustomTransition = true;
    } else if (areTransitionsProvidedInRouteDeclaration) {
      shouldUseCustomTransition = false;
    } else if (this.options.customTransition != null) {
      shouldUseCustomTransition = true;
    } else if (areTransitionsProvidedInseafarerOptions) {
      shouldUseCustomTransition = false;
    }

    RouteSettings routeSettings = RouteSettings(
      name: settings.name,
      arguments: argsWrapper.copyWith(
        baseArguments: baseArgs != null ? baseArgs : route.defaultArgs,
      ),
    );

    return TransitionFactory.buildTransition(
      transitions: transitions,
      duration: transitionDuration,
      curve: transitionCurve,
      settings: routeSettings,
      customTransition: shouldUseCustomTransition ? customTransition : null,
      builder: (context) => route.builder(
        context,
        baseArgs ?? route.defaultArgs,
        ParamMap(
          route.name,
          argsWrapper!.routeParams,
          argsWrapper.params,
        ),
      ),
    );
  };
}