阻止按钮运行的一种方法是在启动时将逻辑引入 BackHandler 事件侦听器,如下所示:
BackHandler.addEventListener('hardwareBackPress', () => {
const { dispatch, nav } = this.props
if (nav.routes.length === 1 && (nav.routes[0].routeName === 'Login' || nav.routes[0].routeName === 'Start')) return false
dispatch({ type: 'Navigation/BACK' })
return true
})
注意我们是如何观察条件的。这个问题的关键是从事件监听器返回true 或false。 false 使硬件后退按钮停止工作。 true 干净退出事件。
这里有另一个例子来说明:
BackHandler.addEventListener('hardwareBackPress', () => {
const { dispatch, nav } = this.props
if (nav.routes[0].routeName === 'TriviaQuestion') return false
if (!playTimeLeft && (nav.routes[0].routeName === 'TriviaQuestion')) return false
if (nav.routes[0].routeName === 'InvasiveDialog') return false
dispatch({ type: 'Navigation/BACK' })
return true
})
这里有一些示例代码,除了阻止后退按钮发挥作用之外,这些示例代码还可以用于更多目的:
import React, { Component } from 'react'
import { Platform, BackHandler } from 'react-native'
import { Provider, connect } from 'react-redux'
import { addNavigationHelpers } from 'react-navigation'
import { NavigationStack } from './navigation/nav_reducer'
import store from './store'
class App extends Component {
componentWillMount() {
if (Platform.OS !== 'android') return
BackHandler.addEventListener('hardwareBackPress', () => {
const { dispatch, nav } = this.props
if (nav.routes.length === 1 && (nav.routes[0].routeName === 'Login' || nav.routes[0].routeName === 'Start')) return false
dispatch({ type: 'Navigation/BACK' })
return true
})
}
componentWillUnmount() {
if (Platform.OS === 'android') BackHandler.removeEventListener('hardwareBackPress')
}
render() {
const { dispatch, nav } = this.props
const navigation = addNavigationHelpers({
dispatch,
state: nav
})
return <NavigationStack navigation={navigation} />
}
}
const mapStateToProps = ({ nav }) => ({ nav })
const RootNavigationStack = connect(mapStateToProps)(App)
const Root = () => (
<Provider store={store}>
<RootNavigationStack />
</Provider>
)
export default Root
如果您在尝试让您的后退按钮简单工作时发现这篇文章,那么请尽可能地复制我的上一个示例。完全按照所示使用事件侦听器,并首先测试您的应用,看看它是如何工作的。
如果你使用 Redux,这就是你想要的。
NavigationStack 只是引用另一个文件中的export const NavigationStack = StackNavigator({ ...etc })。