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

标签 react-native react-navigation react-native-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,
        },
      }
    )

选项卡堆栈
    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);

我想了解如何进行重置,例如:
    reset from UserProfile to TabStack (in AppStack) to AuthStack

我试着这样做
const resetAction = StackActions.reset({
        index: 0,
        actions: [NavigationActions.navigate({ routeName: 'AuthStack' })],
    });
    this.props.navigation.dispatch(resetAction);

或者这样
const resetAction = StackActions.reset({
        index: 0,
        key: null,
        actions: [NavigationActions.navigate({ routeName: 'AuthStack' })],
    });
    this.props.navigation.dispatch(resetAction);

但我得到了错误

there is no route defined for AuthStack



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

最佳答案

您的 resetAction不成功,因为您在 TabStack 上发送它(因为您在 this.props.navigation.dispatch 上调用 UserProfile,如果我没听错的话)。您需要发送resetAction给您的MainStack反而。 This thread here提出了一些可以实现这一目标的方法。而且,这是我的首选解决方案,因为我不必在导航器周围传递 Prop 或调用多个嵌套操作。

  • 创建 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,
    };
    
  • 在您的 App.js 上或您呈现的任何其他文件MainStack , 这样做设置引用

  • import NavigationService from './navigationService';
    
    ...
    
    render() {
      return (
    
        ...
        <MainStack
          ref={navigatorRef => {
            NavigationService.setTopLevelNavigator(navigatorRef);
          }}
        />
        ...
    
      )
    }
    
  • 无论何时何地你想重置到你的AuthStack (或您的 MainStack 中的任何其他堆栈),只需导入 NavigationService并调用

  • NavigationService.navigateAndReset('Auth', {...yourParamsIfAny});
    // 'Auth' because you named it that way in your 'MainStack'
    

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

    已编辑

    以前的解决方案,在 navigationService.js , 用于 StackNavigator作为 MainStack
    function navigateAndReset(routeName, params) {
      _navigator.dispatch(
        StackActions.reset({
          index: 0,
          actions: [
            NavigationActions.navigate({
              routeName,
              params,
            }),
          ],
        })
      );
    }
    

    关于react-native - react-navigation 3 在嵌套堆栈中重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54755122/

    相关文章:

    reactjs - 纬度的值不能在 native react 中从字符串转换为 double

    javascript - 与 react 导航的深度链接不起作用

    android - 我有两个不同的 react native 包,它们需要不同的 android compileSdkVersion,我该如何解决这个问题?

    android - 生成 APK 后 react native 黑屏

    typescript - 从已解析的 Promise 返回 json 对象并在加载后分配它

    javascript - 在react-router-dom中如何像react-navigation一样获得 `previous`?

    javascript - react native 后退按钮缺少图标

    reactjs - 如何在 React Native 中显示一次屏幕?

    react-native - 当 RN 屏幕变化时(调用导航时)监听的钩子(Hook)

    javascript - 根据用户的方向生成标记