【问题标题】:React Native react navigation redux handle Android back buttonReact Native 反应导航 redux 处理 Android 后退按钮
【发布时间】:2018-09-07 13:25:04
【问题描述】:

在使用与 redux 集成的反应导航时,我正在关注试图处理 Android 后退按钮的文档。

当前按下后退按钮会退出整个应用程序,无论您按下它。我试图通过在 Root 组件上添加处理程序来按照指南处理后按:

 const persistConfig = {
      key: 'root',
      storage,
      blacklist: ['nav'],
    };

    const AppNavigator = createStackNavigator(
      {
        SelectScreen,
        PageScreen,
        SettingsScreen,
      },
      {
        initialRouteName: 'SelectScreen',
      },
    );

    const navReducer = createNavigationReducer(AppNavigator);
    const appReducer = combineReducers({
      nav: navReducer,
      theme: themeReducer,
      page: pageReducer,
    });
    const persistedReducer = persistReducer(persistConfig, appReducer);

    const middleware = createReactNavigationReduxMiddleware('root', state => state.nav);

    const App = reduxifyNavigator(AppNavigator, 'root');
    const mapStateToProps = state => ({
      state: state.nav,
    });
    const AppWithNavigationState = connect(mapStateToProps)(App);

    const store = createStore(persistedReducer, applyMiddleware(middleware));
    const persistor = persistStore(store);

    class Root extends React.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 (
          <Provider store={store}>
            <PersistGate loading={null} persistor={persistor}>
              <AppWithNavigationState />
            </PersistGate>
          </Provider>
        );
      }
    }

    AppRegistry.registerComponent(appName, () => Root);

但是,我收到一个错误,因为导航道具在根组件中不存在。由于我缺乏理解,我知道这可能是一个错误,因此我非常感谢有关如何使其正常工作的一些帮助!

谢谢

【问题讨论】:

    标签: reactjs react-native redux react-navigation


    【解决方案1】:

    您可以通过将其传递给可以访问Provider store 的另一个组件来做到这一点。

    AppNavigation.js

    const PrimaryNav = createStackNavigator(
          {
            SelectScreen,
            PageScreen,
            SettingsScreen,
          },
          {
            initialRouteName: 'SelectScreen',
          },
     );
    
    export const appNavigatorMiddleware = createReactNavigationReduxMiddleware(
      'root',
      state => state.nav
    ); //... Import it to your configure store file, to apply the middleware
    
    const AppNavigator = reduxifyNavigator(PrimaryNav, 'root');
    
    export default AppNavigator
    

    ReduxNavigation.js

    import React from 'react'
    import { BackHandler, Platform } from 'react-native'
    import { connect } from 'react-redux'
    import AppNavigation from './AppNavigation' //... Import from AppNavigation.js
    
    class ReduxNavigation extends React.Component {
      ...// Add your BackHandler Code here
    
      render () {
        return <AppNavigation state={this.props.nav}  dispatch={this.props.dispatch}/>
      }
    }
    
    const mapStateToProps = state => ({ nav: state.nav })
    export default connect(mapStateToProps)(ReduxNavigation)
    

    App.js

    class App extends Component {
      render () {
        return (
          <Provider store={store}>
            <PersistGate loading={null} persistor={persistor}>
             <RootContainer />
            </PersistGate>
          </Provider>
        )
      }
    }
    

    【讨论】:

    • appNavigatorMiddleware 应该被导入到您将在applyMiddleware 中创建和初始化store 的位置,RootContainer.js 只是另一个组件,您需要将其添加到App.js跨度>
    【解决方案2】:

    由于我没有足够的代表,我不得不发布这个作为答案。

    请仔细阅读:

    https://reactnavigation.org/docs/en/custom-android-back-button-handling.html

    查看示例,但查看构造函数中的侦听器:

    this._didFocusSubscription = props.navigation.addListener('didFocus', payload =>
      BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
    );
    

    看起来你在正确的轨道上,你只需要将监听器添加到props.navigation

    【讨论】:

    • 感谢您的回答!我已经尝试过了,但出现错误,props.navigation 未定义。还是我最初遇到的同样的问题,这个组件中没有导航道具
    • 你使用的是什么版本的 React Native 和 Navigation?
    最近更新 更多