【发布时间】:2018-04-08 20:33:41
【问题描述】:
我正在尝试使用带有 redux 集成的嵌套导航器,但应用程序无法加载并出现以下错误:
在我为登录流程添加第二层导航器之前,一切正常。
我怎样才能做到这一点?
这里是导航器的完整代码并将其与 redux 集成:
import React, { Component } from 'react';
import { BackHandler } from "react-native";
import { connect } from 'react-redux';
import { fromJS } from 'immutable';
import { dogTypes } from '../ducks/dog';
import { StackNavigator, addNavigationHelpers, NavigationActions } from 'react-navigation';
import { createReduxBoundAddListener, createReactNavigationReduxMiddleware } from 'react-navigation-redux-helpers';
import MainScreen from '../screens/MainScreen';
import SecondScreen from '../screens/SecondScreen';
import AuthLoadingScreen from '../screens/AuthLoadingScreen';
import AuthScreen from '../screens/AuthScreen';
import HeaderWithMenu from '../components/Headers/HeaderWithMenu';
import HeaderWithBack from '../components/Headers/HeaderWithBack';
import Translations from '../translations/screens';
const MainNavigator = StackNavigator({
LoginFlow: {
screen: StackNavigator({
AuthLoading: AuthLoadingScreen,
Auth: AuthScreen,
},
{
initialRouteName: 'AuthLoading',
})
},
MainFlow: {
screen: StackNavigator({
Main: {
screen: MainScreen,
navigationOptions: ({navigation}) => ({
header: <HeaderWithMenu title={Translations.t('mainScreen')}/>
})
},
Second: {
screen: SecondScreen,
navigationOptions: ({navigation}) => ({
header: <HeaderWithBack title={Translations.t('secondScreen')} navigation={navigation}/>
})
},
},
{
initialRouteName: 'Main'
})
}
},
{
initialRouteName: 'MainFlow'
});
const initialState = fromJS(
{
index: 0,
routes: [
{
index: 0,
key: 'MainFlow',
routeName: 'MainFlow',
routes: [
{
key: 'Main',
routeName: 'Main'
}
]
}
]
}
);
export const mainNavReducer = (state = initialState, action) => {
let nextState;
switch (action.type) {
case dogTypes.DOG_BIGGER:
nextState = state.merge(MainNavigator.router.getStateForAction(
MainNavigator.router.getActionForPathAndParams('Second'),
state.toJS()
));
break;
default:
nextState = state.merge(MainNavigator.router.getStateForAction(action, state.toJS()));
break;
}
// Simply return the original `state` if `nextState` is null or undefined.
return nextState || state;
};
export const mainNavMiddleware = createReactNavigationReduxMiddleware(
"root",
state => state.nav,
)
const addListener = createReduxBoundAddListener("root");
class App extends Component {
componentDidMount() {
BackHandler.addEventListener("hardwareBackPress", this.onBackPress);
}
componentWillUnmount() {
BackHandler.removeEventListener("hardwareBackPress", this.onBackPress);
}
onBackPress = () => {
const { dispatch, nav } = this.props;
if (nav.index === 0) {
return false;
}
dispatch(NavigationActions.back());
return true;
};
render() {
return (
<MainNavigator navigation={addNavigationHelpers({
dispatch: this.props.dispatch,
state: this.props.nav,
addListener,
})} />
);
}
}
const mapStateToProps = (state) => {
return {
nav: state.get('nav').toJS()
}
};
export const MainNavigatorComponent = connect(mapStateToProps)(App);
【问题讨论】:
标签: react-native react-redux react-navigation