call method

  1. @override
void call(
  1. Store<T> store,
  2. dynamic action,
  3. NextDispatcher next
)

A Middleware function that intercepts a dispatched action

Implementation

@override
void call(Store<T> store, dynamic action, NextDispatcher next) {
  if (action is NavigateToAction) {
    final navigationAction = action;
    final currentState =
        this.currentState ?? NavigatorHolder.navigatorKey.currentState;

    if (action.preNavigation != null) {
      action.preNavigation!();
    }

    switch (navigationAction.type) {
      case NavigationType.shouldReplace:
        currentState!.pushReplacementNamed(navigationAction.name!,
            arguments: navigationAction.arguments);
        this._setState(NavigationDestination(
            navigationAction.name!, navigationAction.arguments));
        break;
      case NavigationType.shouldPop:
        currentState!.pop();
        this._setState(NavigatorHolder.state?.previousDestination);
        break;
      case NavigationType.shouldPopUntil:
        currentState!.popUntil(navigationAction.predicate!);
        this._setState(null);
        break;
      case NavigationType.shouldPushNamedAndRemoveUntil:
        currentState!.pushNamedAndRemoveUntil(
            navigationAction.name!, navigationAction.predicate!,
            arguments: navigationAction.arguments);
        this._setState(null);
        break;
      default:
        currentState!.pushNamed(navigationAction.name!,
            arguments: navigationAction.arguments);
        this._setState(NavigationDestination(
            navigationAction.name!, navigationAction.arguments));
    }

    if (action.postNavigation != null) {
      action.postNavigation!();
    }
  }

  next(action);
}