【发布时间】: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;
【问题讨论】:
-
通过断开连接,是否会转到
Authes 预期?也许只是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