代码之家  ›  专栏  ›  技术社区  ›  Hasangi

React navigation redux helpers error:此导航器同时具有导航和容器属性,因此不清楚它是否应该拥有自己的状态

  •  3
  • Hasangi  · 技术社区  · 7 年前

    我正在尝试使用react native with expo中的react navigation redux helpers将redux与react navigation集成。然而,虽然我遵循了文档,但我得到了以下错误。

    这个导航器同时拥有导航和容器道具,所以不清楚它是否应该拥有自己的状态。移除道具:“导航”如果导航者应该从导航道具获取其状态。如果导航员应该保持自己的状态,不要通过导航道具。

    下面是我与redux和react导航实现相关的代码。

    应用导航器.js

    import React from 'react';
    import {createSwitchNavigator, createStackNavigator} from 'react-navigation';
    import {connect} from 'react-redux';
    import {reduxifyNavigator,createReactNavigationReduxMiddleware} from "react-navigation-redux-helpers";
    
    import MainTabNavigator from './MainTabNavigator';
    
    
    export const AuthStack = createStackNavigator(
        {
            Main: MainTabNavigator,
        },
        {
            headerMode: 'none'
        }
    );
    
    export const AppNavigator = createSwitchNavigator(
        {
            Auth: AuthStack,
        },
        {
            headerMode: 'none',
            initialRouteName: 'Auth',
        }
    );
    
    
    export const NavMiddleware = createReactNavigationReduxMiddleware(
        "root",
        state => state.nav,
    );
    
    const addListener = reduxifyNavigator(AppNavigator, 'root');
    
    
    const mapStateToProps = state => ({
        nav: state.nav,
    });
    
    export const AppWithNavigationState = connect(mapStateToProps)(addListener);
    

    应用程序.js

    import React from 'react';
    import {Platform, StatusBar, StyleSheet, View} from 'react-native';
    import {AppLoading, Asset, Font, Icon} from 'expo';
    import {AppWithNavigationState}  from './navigation/AppNavigator';
    import {applyMiddleware, createStore} from "redux";
    import AppReducer from './reducers/AppReducer'
    import {Provider} from "react-redux";
    import {NavMiddleware} from './navigation/AppNavigator'
    
    const store = createStore(AppReducer,applyMiddleware(NavMiddleware));
    
    export default class App extends React.Component {
      state = {
        isLoadingComplete: false,
      };
    
      render() {
    
        if (!this.state.isLoadingComplete && !this.props.skipLoadingScreen) {
          return (
            <AppLoading
              startAsync={this._loadResourcesAsync}
              onError={this._handleLoadingError}
              onFinish={this._handleFinishLoading}
            />
          );
        } else {
          return (
            <View style={styles.container}>
              {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
              <Provider store={store}>
                  <AppWithNavigationState/>
              </Provider>
            </View>
          );
        }
      }
    
      _loadResourcesAsync = async () => {
        return Promise.all([
          Asset.loadAsync([
            require('./assets/images/robot-dev.png'),
            require('./assets/images/robot-prod.png'),
          ]),
          Font.loadAsync({
            // This is the font that we are using for our tab bar
            ...Icon.Ionicons.font,
            // We include SpaceMono because we use it in HomeScreen.js. Feel free
            // to remove this if you are not using it in your app
            'space-mono': require('./assets/fonts/SpaceMono-Regular.ttf'),
          }),
        ]);
      };
    
      _handleLoadingError = error => {
        // In this case, you might want to report the error to your error
        // reporting service, for example Sentry
        console.warn(error);
      };
    
      _handleFinishLoading = () => {
        this.setState({ isLoadingComplete: true });
      };
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: '#fff',
      },
    });
    

    navReducer.js公司

    import {AppNavigator} from '../navigation/AppNavigator';
    
    const router = AppNavigator.router;
    const mainNavAction = router.getActionForPathAndParams('Auth');
    const initialNavState = router.getStateForAction(mainNavAction);
    
    
    const NavigationReducer = (state = initialNavState, action) => {
        console.log('routes', router);
        return router.getStateForAction(action, state) || state;
    
    };
    
    export default NavigationReducer;
    

    "use strict";
    
    import {VendorReducer} from './vendorReducer';
    import {combineReducers} from "redux";
    import NavigationReducer from "./navReducer";
    
    const AppReducer = combineReducers({
        nav:NavigationReducer,
        vendor: VendorReducer,
    });
    
    export default AppReducer;
    

    下面是my package.json。

    {
      "name": "my-new-project",
      "main": "node_modules/expo/AppEntry.js",
      "private": true,
      "scripts": {
        "start": "expo start",
        "android": "expo start --android",
        "ios": "expo start --ios",
        "eject": "expo eject",
        "test": "node ./node_modules/jest/bin/jest.js --watchAll"
      },
      "jest": {
        "preset": "jest-expo"
      },
      "dependencies": {
        "@expo/samples": "2.1.1",
        "expo": "^30.0.1",
        "react": "16.3.1",
        "react-native": "https://github.com/expo/react-native/archive/sdk-30.0.0.tar.gz",
        "react-navigation": "2.16.0",
        "react-navigation-redux-helpers": "2.0.6",
        "react-redux": "5.0.7",
        "redux": "4.0.0",
        "redux-logger": "3.0.6",
        "redux-thunk": "2.3.0"
      },
      "devDependencies": {
        "jest-expo": "30.0.0",
        "redux-devtools": "3.4.1"
      }
    }
    

    我希望有人能帮我渡过难关。提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Sophie Cooperman    7 年前

    这也是我的错误!解决方法:

    const mapStateToProps = state => ({
      state: state.nav,
    });
    

    注意 状态

    如果你需要,我可以发布我的整个redux集成与导航,为我工作。

    推荐文章