【问题标题】:How to reset navigator with using NavigationService in React Navigation?如何在 React Navigation 中使用 NavigationService 重置导航器?
【发布时间】:2019-04-04 19:43:16
【问题描述】:

我通过开发我的应用程序在 React Navigation 中使用 NavigationService method。我有一个使用 Redux 开发的 Auth 页面。当用户登录 Auth 页面时,该页面链接到 Main Page。

但是,我可以通过滑动(在 IOS 中)或按下后退按钮(在 Android 中)返回身份验证页面。用户登录或通过认证页面后如何重置导航器?

下面是登录过程的my函数:

const loginSuccess = (dispatch, user) => {

   console.log('LOGINSUCCESS --> OK!');
  return dispatch => {
    NavigationService.navigate('Main');
    dispatch({
      type: LOGIN_USER_SUCCESS,
      payload: user,
    });
  };
};

【问题讨论】:

    标签: react-native react-navigation


    【解决方案1】:

    我已经解决了这个问题。

    首先,我想在下面显示我的NavigationService.js 代码:

    import { NavigationActions, StackActions } from "react-navigation";
    
    let _navigator;
    
    function setTopLevelNavigator(navigatorRef) {
      _navigator = navigatorRef;
    }
    
    function navigate(routeName, params) {
      _navigator.dispatch(
        NavigationActions.navigate({
          routeName,
          params,
        }),
      );
    }
    
    // add other navigation functions that you need and export them
    
    export default {
      navigate,
      navigateReset,
      setTopLevelNavigator,
    };
    

    然后,我添加了一些重置导航器的代码。 (这意味着当您通过下一个屏幕但再也不会通过滑动或 Android 后退按钮返回时。)

    function navigateReset(routeName, params) {
      _navigator.dispatch(
        StackActions.reset({
          index: 0,
          actions: [
            NavigationActions.navigate({
              routeName,
              params,
            }),
          ],
        }),
      );
    }
    

    最后,我用新功能编辑了我的动作代码:

    const loginSuccess = (dispatch, user) => {
      firebase
        .database()
        .ref('/users/' + user.user.uid)
        .once('value')
        .then((snapshot) => {
          dispatch({
            type: LOGIN_USER_SUCCESS,
            payload: user,
            myUser: {
              uid: user.user.uid,
              email: user.user.email,
              name: snapshot.val().displayName,
              groups: snapshot.val().groups,
            },
          });
        });
    
      dispatch(() => {
        NavigationService.navigateReset('Main'); // Edited code.
      });
    
      console.log('LOGINSUCCESS --> OK!');
    };
    

    呸呸呸!恭喜!现在,您在登录后永远不会返回登录屏幕。

    【讨论】:

      【解决方案2】:

      不需要从方法返回。它将直接移动到特定屏幕。

      dispatch(
          NavigationService.navigate('Main')
        );
      

      【讨论】:

      • 它没有用。 :( 你能用 NavigationService 方法编辑你的答案吗?
      • 这完全没有错(但你应该将'Main 修复为'Main'),它可以工作但不能重置导航器。只换屏幕。
      • 它的拼写错误。
      猜你喜欢
      • 2020-12-06
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多