반응 탐색에서 뒤로 버튼 비활성화


85

반응 네이티브 탐색 (반응 탐색) StackNavigator를 사용하고 있습니다. 앱의 전체 수명주기 동안 로그인 페이지에서 시작됩니다. 뒤로 옵션을 원하지 않고 로그인 화면으로 돌아갑니다. 로그인 화면 후 화면에서 숨길 수있는 방법을 아는 사람이 있습니까? BTW, 나는 또한 다음을 사용하여 로그인 화면에서 숨기고 있습니다.

const MainStack = StackNavigator({
  Login: {
    screen: Login,
    navigationOptions: {
      title: "Login",
      header: {
        visible: false,
      },
    },
  },
  // ... other screens here
})

답변:


202

1) react-navigation v2 이상에서 뒤로 버튼을 사라지게하려면 :

navigationOptions:  {
    title: 'MyScreen',
    headerLeft: null
}

2) 탐색 스택을 정리하려면 :

탐색하려는 화면에 있다고 가정합니다.

react-navigation 버전 v5 이상 을 사용하는 경우 navigation.reset또는 CommonActions.reset다음을 사용할 수 있습니다 .

 // Replace current navigation state with a new one,
 // index value will be the current active route:

navigation.reset({
  index: 0,
  routes: [{ name: 'Profile' }],
});

출처 및 추가 정보 : https://reactnavigation.org/docs/navigation-prop/#reset

또는:

navigation.dispatch(
  CommonActions.reset({
    index: 1,
    routes: [
      { name: 'Home' },
      {
        name: 'Profile',
        params: { user: 'jane' },
      },
    ],
  })
);

출처 및 추가 정보 : https://reactnavigation.org/docs/navigation-actions/#reset

이전 버전의 react-navigation :

v2-v4 사용StackActions.reset(...)

import { StackActions, NavigationActions } from 'react-navigation';

const resetAction = StackActions.reset({
  index: 0, // <-- currect active route from actions array
  actions: [
    NavigationActions.navigate({ routeName: 'myRouteWithDisabledBackFunctionality' }),
  ],
});

this.props.navigation.dispatch(resetAction);

v1 사용NavigationActions.reset

3) Android의 경우 BackHandler를 사용하여 하드웨어 뒤로 버튼도 비활성화해야합니다 .

http://reactnative.dev/docs/backhandler.html

또는 후크를 사용하려는 경우 :

https://github.com/react-native-community/hooks#usebackhandler

그렇지 않으면 탐색 스택이 비어있는 경우 Android 하드웨어 뒤로 버튼을 누를 때 앱이 닫힙니다.


4
이렇게하면 뒤로 버튼이 제거되지만 Android에서는 기기 뒤로 버튼을 사용하여 계속 탐색 할 수 있습니다. 그것을 비활성화하는 방법도 있습니까?
Gokul Kulkarni

2
당신은 왕이야
디미트리 필리포

3
2018 년에는 "NavigationActions.reset (...)"대신 "StackAction.reset (...)"을 사용하십시오. reactnavigation.org/docs/en/stack-actions.html
Manuel

1
"index : 1"을 사용할 때 "정의되지 않은 키를 읽을 수 없습니다". 따라서이 오류를 수정하기 위해 "index : 0"을 사용합니다. 나는 그것을 이해하게 생각
마우 Pastorini

1
API가 다시 개선 된 것 같습니다. 적어도 v5에서는 이제 재설정 작업을 수행하는 더 짧은 방법이 있습니다. reactnavigation.org/docs/navigation-prop#reset
AndyO

34

당신이 사용하는 생각이 this.props.navigation.replace( "HomeScreen" )대신 this.props.navigation.navigate( "HomeScreen" ).

이렇게하면 스택에 아무것도 추가하지 않습니다. 그래서 HomeScreen은 안드로이드에서 뒤로 버튼을 누르거나 IOS에서 화면을 오른쪽으로 스 와이프해도 돌아갈 아무것도 흔들지 않습니다.

자세한 내용은 문서를 확인하십시오 . 물론 설정하여 뒤로 버튼을 숨길 수 있습니다 headerLeft: null.navigationOptions


replace를 사용하여 매개 변수를 전달할 수 없습니다.
Deepak Pathak

17

을 사용하여 뒤로 버튼을 숨길 수 left:null있지만 Android 기기의 경우 사용자가 뒤로 버튼을 누르면 뒤로 돌아갈 수 있습니다. 탐색 상태를 재설정하고 버튼을 숨겨야합니다.left:null

다음은 탐색 상태를 재설정하는 문서입니다. https://reactnavigation.org/docs/navigators/navigation-actions#Reset

이 솔루션은에서 작동 react-navigator 1.0.0-beta.7하지만 left:null더 이상 최신 버전에서는 작동하지 않습니다.


5
iOS에서는 화면 가장자리에서 슬라이드하여 뒤로 이동할 수 있습니다. 탐색 상태를 재설정하는 것은 반드시 필요합니다.
cameronmoreau

17

gesturesEnabled와 함께 headerLeft에 false를 설정해야 합니다 null. 화면을 스 와이프하여 뒤로 이동할 수 있기 때문입니다.

navigationOptions:  {
   title: 'Title',
   headerLeft: null,
   gesturesEnabled: false,
}

9

React Native에서 BackHandler를 사용하면 저에게 효과적이었습니다. ComponentWillMount에 다음 행을 포함하십시오.

BackHandler.addEventListener('hardwareBackPress', function() {return true})

그것은 안드로이드 장치에서 뒤로 버튼을 비활성화합니다.


이것은 Android 전용입니다.
georgiosd

4

직접 찾았습니다.) 추가 :

  left: null,

기본 뒤로 버튼을 비활성화합니다.

const MainStack = StackNavigator({
  Login: {
    screen: Login,
    navigationOptions: {
      title: "Login",
      header: {
        visible: false,
      },
    },
  },
  FirstPage: {
    screen: FirstPage,
    navigationOptions: {
      title: "FirstPage",
      header: {
        left: null,
      }
    },
  },

4

반응 탐색 버전> = 1.0.0-beta.9

navigationOptions:  {
   headerLeft: null
}

3

이 상황을 처리하는 가장 좋은 방법은 React navigation에서 제공하는 SwitchNavigator를 사용하는 것 입니다. SwitchNavigator의 목적은 한 번에 한 화면 만 표시하는 것입니다. 기본적으로 백 액션을 처리하지 않으며 전환 할 때 경로를 기본 상태로 재설정합니다. 이것은 인증 흐름에 필요한 정확한 동작입니다.

이것은 그것을 구현하는 일반적인 방법입니다.

  1. 2 개의 스택 탐색기 생성 : 하나는 인증 (로그인, 가입, 비밀번호 분실 등) 용이고 다른 하나는 메인 앱용입니다.
  2. 표시하려는 스위치 탐색기의 경로를 확인할 화면을 만듭니다 (일반적으로 토큰이 비동기 저장소에 저장되어 있는지 확인하여 스플래시 화면에서 확인합니다).

다음은 위 명령문의 코드 구현입니다.

import { createAppContainer, createSwitchNavigator } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import HomeScreen from "./homeScreenPath" 
import OtherScreen from "./otherScreenPath"
import SignInScreen from "./SignInScreenPath" 
import SplashScreen from "./SplashScreenPath"

const AppStack = createStackNavigator({ Home: HomeScreen, Other: OtherScreen });

const AuthStack = createStackNavigator({ SignIn: SignInScreen });


export default createAppContainer(
  createSwitchNavigator(
    {
      Splash: SplashScreen,
      App: AppStack,
      Auth: AuthStack,
    },
    {
      initialRouteName: 'Splash',
    }
  )
);

이제 SplashScreen에서 토큰을 확인하고 그에 따라 탐색합니다.

import React from 'react';
import {
  ActivityIndicator,
  AsyncStorage,
  StatusBar,
  StyleSheet,
  View,
} from 'react-native';

class SplashScreen extends React.Component {
  componentDidMount() {
    this.checkIfLogin();
  }

  // Fetch the token from storage then navigate to our appropriate place
  checkIfLogin = async () => {
    const userToken = await AsyncStorage.getItem('userToken');

    // This will switch to the App screen or Auth screen and this splash
    // screen will be unmounted and thrown away.
    this.props.navigation.navigate(userToken ? 'App' : 'Auth');
  };

  // Render any loading content that you like here
  render() {
    return (
      <View>
        <ActivityIndicator />
        <StatusBar barStyle="default" />
      </View>
    );
  }
}

SwitchNavigator에서 경로를 변경하면 이전 경로가 자동으로 제거되므로 뒤로 버튼을 누르면 더 이상 인증 / 로그인 화면으로 이동하지 않습니다.


2

headerLeft를 null로 설정하여 수정할 수 있습니다.

static navigationOptions =({navigation}) => {
    return {
        title: 'Rechercher une ville',
        headerLeft: null,
    }  
}

1

SwitchNavigator는 이 작업을 수행 할 수있는 방법이 될 것입니다. 작업이 호출 SwitchNavigator되면 기본 경로를 재설정하고 인증 화면을 마운트 해제합니다 navigate.

import { createSwitchNavigator, createStackNavigator, createAppContainer } from 'react-navigation';

// Implementation of HomeScreen, OtherScreen, SignInScreen, AuthLoadingScreen
// goes here.

const AppStack = createStackNavigator({ Home: HomeScreen, Other: OtherScreen });
const AuthStack = createStackNavigator({ SignIn: SignInScreen });

export default createAppContainer(createSwitchNavigator(
  {
    AuthLoading: AuthLoadingScreen,
    App: AppStack,
    Auth: AuthStack,
  },
  {
    initialRouteName: 'AuthLoading',
  }
));

사용자가 SignInScreen으로 이동하여 자격 증명을 입력하면 다음을 호출합니다.

this.props.navigation.navigate('App');

1

간단하게

headerLeft: null

이 답변을 읽을 때 더 이상 사용되지 않을 수 있습니다. 다음을 사용해야합니다.

   navigationOptions = {
        headerTitle : "Title",
        headerLeft : () => {},
    }

1

Typescript가있는 최신 버전 React Navigation 5의 경우 :

<Stack.Screen
    name={Routes.Consultations}
    component={Consultations}
    options={{headerLeft: () => null}}
  />

1

ReactNavigation v 5.0-스택 옵션 :

options={{
headerLeft: () => { 
 return <></>; 
}
}}

항상 당신이 무엇을하고 있는지 당신의 대답에 기술하십시오. 업데이트하거나 제거해야합니다. 더 많은 답변을 제공하기 전에 답변 방법을 읽어 보세요 ^^
finnmglas

0

나는 그것이 간단하다고 생각한다 headerLeft : null. 나는 react-native cli를 사용하고 있으므로 이것이 예이다.

static navigationOptions = {
    headerLeft : null
};

0

최신 버전의 React Navigation의 경우 경우에 따라 null을 사용하더라도 "뒤로"작성된 것으로 표시 될 수 있습니다!

화면 이름 아래 의 기본 app.js 에서이를 수행하거나 클래스 파일 로 이동하여 다음 을 추가하십시오.-

static navigationOptions = {
   headerTitle:'Disable back Options',
   headerTitleStyle: {color:'white'},
   headerStyle: {backgroundColor:'black'},
   headerTintColor: 'red',
   headerForceInset: {vertical: 'never'},
   headerLeft: " "
}

0

최신 버전 (v2)에서 작동합니다 headerLeft:null. 다음 navigationOptions과 같이 컨트롤러를 추가 할 수 있습니다.

static navigationOptions = {
    headerLeft: null,
};

0

반응 탐색 버전 4.x의 경우

navigationOptions: () => ({
      title: 'Configuration',
      headerBackTitle: null,
      headerLayoutPreset:'center',
      headerLeft: null
    })

0
headerLeft: null

이것은 최신 반응 네이티브 버전에서 작동하지 않습니다.

그것은해야한다:

navigationOptions = {
 headerLeft:()=>{},
}

Typescript의 경우 :

navigationOptions = {
 headerLeft:()=>{return null},
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.