generator method

RouteFactory generator({
  1. Widget builder(
    1. BuildContext context,
    2. Widget widget
    )?,
})

Generates the RouteFactory which builds a Route on request.

These routes are built using the NyRouterRoutes addRoute method.

Implementation

RouteFactory generator(
    {Widget Function(BuildContext context, Widget widget)? builder}) {
  return (RouteSettings settings) {
    if (settings.name == null) return null;

    Uri? uriSettingName;
    try {
      uriSettingName = Uri.parse(settings.name!);
    } on FormatException catch (e) {
      NyLogger.error(e.toString());
    }

    String routeName = settings.name!;
    if (uriSettingName != null) {
      routeName = uriSettingName.path;
    }

    ArgumentsWrapper? argumentsWrapper;
    if (settings.arguments is ArgumentsWrapper) {
      argumentsWrapper = settings.arguments as ArgumentsWrapper?;
    } else {
      argumentsWrapper = ArgumentsWrapper();
      argumentsWrapper.baseArguments = NyArgument(settings.arguments);
    }

    if (argumentsWrapper?.baseArguments?.data != null &&
        argumentsWrapper?.prefix != null) {
      String prefix = argumentsWrapper!.prefix!;
      routeName = routeName.replaceFirst(prefix, "");
    }

    if (argumentsWrapper == null) {
      argumentsWrapper = ArgumentsWrapper();
    }

    if (uriSettingName != null && uriSettingName.queryParameters.isNotEmpty) {
      argumentsWrapper.queryParameters =
          NyQueryParameters(uriSettingName.queryParameters);
    }

    final NyArgument? baseArgs = argumentsWrapper.baseArguments;
    final NyQueryParameters? queryParameters =
        argumentsWrapper.queryParameters;

    if (argumentsWrapper.pageTransitionSettings == null) {
      argumentsWrapper.pageTransitionSettings = PageTransitionSettings();
    }

    final NyRouterRoute? route = _routeNameMappings[routeName];

    if (route == null) return null;

    if (route.pageTransitionSettings == null) {
      route.pageTransitionSettings = PageTransitionSettings();
    }

    if (Nylo.instance.onDeepLinkAction != null &&
        queryParameters?.data is Map) {
      if ((queryParameters?.data as Map).containsKey('deepLink')) {
        Nylo.instance.onDeepLinkAction!(route.name, queryParameters?.data);
      }
    }

    return PageTransition(
      child: StatefulBuilder(
          builder: (BuildContext context, StateSetter setState) {
        if (builder != null) {
          Widget widget = route.builder(
            context,
            baseArgs ?? route.defaultArgs,
            queryParameters ?? route.queryParameters,
          );
          return builder(context, widget);
        }
        return route.builder(context, baseArgs ?? route.defaultArgs,
            queryParameters ?? route.queryParameters);
      }),
      type: argumentsWrapper.pageTransitionType ??
          (route.pageTransitionType ?? PageTransitionType.rightToLeft),
      settings: settings,
      duration: _getPageTransitionDuration(route, argumentsWrapper),
      alignment: _getPageTransitionAlignment(route, argumentsWrapper),
      reverseDuration:
          _getPageTransitionReversedDuration(route, argumentsWrapper),
      matchingBuilder:
          _getPageTransitionMatchingBuilder(route, argumentsWrapper),
      childCurrent: _getPageTransitionChildCurrent(route, argumentsWrapper),
      curve: _getPageTransitionCurve(route, argumentsWrapper),
      ctx: _getPageTransitionContext(route, argumentsWrapper),
      inheritTheme: _getPageTransitionInheritTheme(route, argumentsWrapper),
      fullscreenDialog:
          _getPageTransitionFullscreenDialog(route, argumentsWrapper),
      opaque: _getPageTransitionOpaque(route, argumentsWrapper),
      isIos: _getPageTransitionIsIos(route, argumentsWrapper),
    );
  };
}