react-navigation 3在嵌套堆栈中重置

Adi*_*ari 6 react-native react-native-navigation react-navigation

我试着理解如何在嵌套堆栈中重置我的代码

    const AuthStack = createStackNavigator(
      {
        Welcome,
        Login,
        Register,
        ConfirmationCode,
      },
      {
        initialRouteName: 'Welcome',
        headerMode: 'none',
        lazy: true,
        transitionConfig,
        defaultNavigationOptions: {
          gesturesEnabled: false,
        },
      }
    )

    const AppStack = createStackNavigator(
      {
        TabStack,
        SearchResult,
        BusinessDetail,
        BusinessMap,
        MakeAppointment,
        TermsAndConditions
      },
      {
        initialRouteName: 'TabStack',
        headerMode: 'none',
        lazy: true,
        transitionConfig,
        defaultNavigationOptions: {
          gesturesEnabled: false,
        },
      }
    )

    let MainStack = createSwitchNavigator(
      {
        AuthLoading,
        Auth: AuthStack,
        App: AppStack,
      },
      {
        initialRouteName: 'AuthLoading',
        headerMode: 'none',
        lazy: true,

        defaultNavigationOptions: {
          gesturesEnabled: false,
        },
      }
    )
Run Code Online (Sandbox Code Playgroud)

TabStack

    import React from 'react';

    import { createBottomTabNavigator, createAppContainer } from 'react-navigation';
    import {
        Search,
        MyFavourites,
        MyAppointments,
        UserProfile
    } from '../screens'
    import Icon from 'react-native-vector-icons/Feather';
    import Colors from '../utils/Colors'
    let TabStack = createBottomTabNavigator(
      {
        Search,
         MyFavourites,
         MyAppointments,
         UserProfile,
      },
        initialRouteName: 'ScreenTab1',
        tabBarOptions: {
          activeTintColor: Colors.pink,
          inactiveTintColor: Colors.black,
          showLabel: false,
          style: {
            backgroundColor: 'white'
          }
        },
      }
    )
    export default createAppContainer(TabStack);
Run Code Online (Sandbox Code Playgroud)

我想了解如何重置例如:

    reset from UserProfile to TabStack (in AppStack) to AuthStack
Run Code Online (Sandbox Code Playgroud)

我试着这样做

const resetAction = StackActions.reset({
        index: 0,
        actions: [NavigationActions.navigate({ routeName: 'AuthStack' })],
    });
    this.props.navigation.dispatch(resetAction);
Run Code Online (Sandbox Code Playgroud)

或者这样

const resetAction = StackActions.reset({
        index: 0,
        key: null,
        actions: [NavigationActions.navigate({ routeName: 'AuthStack' })],
    });
    this.props.navigation.dispatch(resetAction);
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

没有为AuthStack定义的路由

我检查了stackoverflow中的问题,但那里的答案对我不起作用,总是向我显示我上面写的相同错误.

wic*_*cky 4

resetAction不成功,因为你正在发送它TabStack(因为你正在调用this.props.navigation.dispatchUserProfile如果我没猜错的话)。您需要将其发送resetAction给您MainStack此线程此处建议了一些实现此目标的方法。而且,这是我的首选解决方案,因为我不必在导航器周围传递道具或用它调用多个嵌套操作。

  1. 创建一个navigationService.js包含以下内容的文件(以保留您的顶级导航器作为参考)
import { NavigationActions, StackActions } from 'react-navigation';

let _navigator;

function setTopLevelNavigator(navigatorRef) {
  _navigator = navigatorRef;
}

function navigateMainNavigator(routeName, params) {
  _navigator.dispatch(
    NavigationActions.navigate({
      routeName,
      params,
    }),
  );
}

// add other navigation functions that you need and export them

export default {
  setTopLevelNavigator,
  navigateMainNavigator,
};
Run Code Online (Sandbox Code Playgroud)
  1. App.js您渲染的文件或任何其他文件上MainStack,执行此操作以设置引用
import NavigationService from './navigationService';

...

render() {
  return (

    ...
    <MainStack
      ref={navigatorRef => {
        NavigationService.setTopLevelNavigator(navigatorRef);
      }}
    />
    ...

  )
}
Run Code Online (Sandbox Code Playgroud)
  1. 无论何时您想要重置到您的堆栈AuthStack(或您的堆栈中的任何其他堆栈MainStack),只需导入NavigationService并调用
NavigationService.navigateAndReset('Auth', {...yourParamsIfAny});
// 'Auth' because you named it that way in your 'MainStack'
Run Code Online (Sandbox Code Playgroud)

=================================================== =========================

已编辑

之前的解决方案,在 中navigationService.js,是StackNavigator作为MainStack

function navigateAndReset(routeName, params) {
  _navigator.dispatch(
    StackActions.reset({
      index: 0,
      actions: [
        NavigationActions.navigate({
          routeName,
          params,
        }),
      ],
    })
  );
}
Run Code Online (Sandbox Code Playgroud)