![](/img/trans.png)
[英]how to hide back button in React-navigation/react-native
[英]How to stop the Android Hardware Back Button from functioning in react-navigation for react-native?
我正在開發一個瑣事游戲,我正在使用反應導航來處理導航,我有3個組件,(新游戲,問題,結果)我不希望用戶回到結果頁面的問題,如果沒有。 問題已經用盡,然而,按下后退按鈕(Android硬件)正在將他帶回問題。 然后,我嘗試處理硬件后退按鈕,如下所示:
componentWillMount() {
this.props.gameState(true);
BackHandler.addEventListener('hardwareBackPress', () => {
if (this.props.gamePlaying) { // Currently set to true. I will set it to false again on NewGame Page.
this.props.navigation.navigate('NewGame');
}
});
}
但是,這會將用戶帶到NewGame屏幕,但是立即回彈到結果頁面,因為它在NewGame頁面中立即觸發NAVIGATION / BACK。 這又將其帶回結果頁面。
我想在登陸NewGame組件頁面后停止后退按鈕。 有辦法嗎?
react-navigation = ^ 1.0.0-beta.11 react-native = 0.44.0
您需要返回true
表示您已經自己處理了后退按鈕,就像您在文檔中看到的那樣。
如果一個訂閱返回true,則不會調用先前注冊的訂閱
您的代碼應如下所示:
componentWillMount() {
this.props.gameState(true);
BackHandler.addEventListener('hardwareBackPress', () => {
if (this.props.gamePlaying) {
this.props.navigation.navigate('NewGame');
return true; // This will prevent the regular handling of the back button
}
return false;
});
}
阻止按鈕運行的一種方法是在啟動時將邏輯引入BackHandler eventlistener,如下所示:
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 })
。
當用戶在StackNavigator中的屏幕之間切換時默認有一個后退按鈕,我們可以通過設置:headerLeft to null來修復它
static navigationOptions =({navigation}) => {
return {
title: 'Rechercher une ville',
headerLeft: null,
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.