【问题标题】:How to Navigate to Screen inside Action Creators with React Navigation 5如何使用 React Navigation 5 在 Action Creators 中导航到屏幕
【发布时间】:2020-08-13 08:05:16
【问题描述】:

React Navigation 5 Auth Flow 中,它表示屏幕将在条件状态更改时自动导航。

  • 我已将屏幕设置为在状态为
    时导航到 HomeScreen isAuthenticated 更改为 true。
  • 控制台中没有错误。 isAuthenticated 确实更改为 是的,但状态后屏幕未导航到 HomeScreen 改变。
  • 我还尝试使用 {NavigationActions} 和 动作创建者中的 {CommonActions}。强制导航,但 也不行。

AuthStackNav.js

import React from 'react';
import { connect } from 'react-redux';
import {createStackNavigator} from '@react-navigation/stack';
import AuthScreen from '../screens/AuthScreen';
import HomeScreen from '../screens/HomeScreen';

const AuthStackNav = ({isAuthenticated}) => {
    const AuthStack = createStackNavigator();

    return (        
        <AuthStack.Navigator initialRouteName='Auth'>
        {
            isAuthenticated ?
            <AuthStack.Screen name='Home' component={HomeScreen} />                
            :
            <AuthStack.Screen  name='Auth' component={AuthScreen} />      
        }                       
                         
        </AuthStack.Navigator>
        
    );
};
const mapStateToProps = ({isAuthenticated}) => {
    return {isAuthenticated};
};
export default connect(mapStateToProps, null)(AuthStackNav);

userActions.js

import {LOGIN_WITH_FACEBOOK} from './types';
import {NavigationActions} from 'react-navigation'; 
import { CommonActions } from '@react-navigation/native'; 

export const loginWithFacebook = () => (dispatch) => {        
    dispatch({ type: LOGIN_WITH_FACEBOOK, payload: {isAuthenticated: true} });   
    dispatch(NavigationActions.navigate({routeName:'Home'}));
    dispatch( CommonActions.navigate({ name: 'Home' }) );                                           
};

userReducer.js

import {LOGIN_WITH_FACEBOOK} from '../actions/types.js';

const initialState = {
    isAuthenticated: false    
};

const userReducer = (state=initialState, action) => {
    switch(action.type){
        case LOGIN_WITH_FACEBOOK: 
            return {...state, ...action.payload};
        default: 
            return state;
    }
}
export default userReducer;

AuthScreen.js

import React from 'react';
import {Text, View, StyleSheet, Image, TouchableOpacity, SafeAreaView} from 'react-native';
import { connect } from 'react-redux';
import {loginWithFacebook} from '../actions/userActions';

const AuthScreen = ({loginWithFacebook}) => {    

    return (
        <View style={styles.screenContainer}>                

                <TouchableOpacity                     
                    activeOpacity={0.5}
                    onPress={loginWithFacebook}
                >  Facebook Login</TouchableOpacity> 

        </View>  
    );
};
const mapDispatchToProps = {
    loginWithFacebook
};
export default connect(null, mapDispatchToProps)(AuthScreen);

AppNav.js

import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import AuthStackNav from './AuthStackNav';

const AppNav = () => {
    return (
        <NavigationContainer>
            <AuthStackNav />
        </NavigationContainer>
    );
};

export default AppNav;

【问题讨论】:

  • 通过断开连接,是否会转到Auth es 预期?也许只是initialRouteName='Auth'...
  • @HagaiHarari 嗨,是的,初始屏幕是 AuthScreen
  • @HagaiHarari 我尝试删除 initialRouteName='Auth',它仍然不起作用。我还尝试在动作创建者中使用 {NavigationActions} 和 {CommonActions} 等替代方法。强制导航,但也不起作用。
  • 从'react-navigation'导入{NavigationActions}; dispatch(NavigationActions.navigate({routeName:'Home'}));
  • 从 '@react-navigation/native' 导入 { CommonActions }; navigation.dispatch(CommonActions.navigate({ name: 'Home' }) );

标签: reactjs react-native react-redux react-navigation react-navigation-v5


【解决方案1】:

我可以用这个guide 解决它。

RootNavigation.js

import * as React from 'react';

export const navigationRef = React.createRef();

export function navigate(name, params) {
  navigationRef.current?.navigate(name, params);
}

AppNav.js

import { navigationRef } from './RootNavigation.js';
const AppNav = () => {
    return (
        <NavigationContainer ref={navigationRef} >
            <AuthStackNav />
        </NavigationContainer>
    );
};

export default AppNav;

userActions.js

export const loginWithFacebook = () => (dispatch) => {        
    dispatch({ type: LOGIN_WITH_FACEBOOK, payload: {isAuthenticated: true} });   
    RootNavigation.navigate('Home');                                    
};

【讨论】:

  • 太棒了!你真的用答案拯救了我。在所有论坛中,我都在寻找一个解决方案,我刚刚找到了使用 React 导航 4.x 的方法,该方法今天已弃用。
【解决方案2】:

Kaizen Tamashi 的答案是正确的。 此外,如果您想要 goBack 功能,只需在 RootNavigation.js 中添加此代码

export function goBack() {
  navigationRef.current?.goBack();
}

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2019-07-08
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2020-07-01
    相关资源
    最近更新 更多