Ошибка React-navigation-redux-helpers: у этого навигатора есть как навигация, так и реквизиты контейнера, поэтому неясно, должен ли он иметь собственное состояние - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь интегрировать редукс с реагирующей навигацией, используя ответную навигацию-редукционные помощники в реактивной с экспо.Однако, несмотря на то, что я следовал документации, я получаю следующую ошибку:

В этом навигаторе есть как навигация, так и реквизиты контейнера, поэтому неясно, должен ли он иметь собственное состояние.Удалите реквизиты: «nav», если навигатор должен получить свое состояние из навигационной стойки.Если навигатор должен поддерживать свое собственное состояние, не передавайте навигационную опору.

Ниже приведен мой код, связанный с реализацией приведения и реакции-навигации.

AppNavigator.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);

App.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;

AppReducer.js

"use strict";

import {VendorReducer} from './vendorReducer';
import {combineReducers} from "redux";
import NavigationReducer from "./navReducer";

const AppReducer = combineReducers({
    nav:NavigationReducer,
    vendor: VendorReducer,
});

export default AppReducer;

Ниже приведен мой 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 Ответ

0 голосов
/ 29 ноября 2018

Это тоже была моя ошибка!решено:для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...