反応ナビゲーションで戻るボタンを無効にする


87

私はreactnativeナビゲーション(react-navigation)StackNavigatorを使用しています。これは、アプリのライフサイクル全体を通じてログインページから始まります。ログイン画面に戻るという戻るオプションは必要ありません。ログイン画面の後に画面に非表示にする方法を知っている人はいますか?ところで、私はまた、以下を使用してログイン画面にそれを隠しています:

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

回答:


209

1)react-navigation v2以降で戻るボタンを非表示にするには:

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

2)ナビゲーションスタックをクリーンアップする場合:

ナビゲートしたい画面が表示されていると仮定します。

あなたが反応し、ナビゲーションバージョンV5以降を使用している場合、あなたは使用することができますnavigation.resetCommonActions.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 2017

2
あなたは王様です
Dimitris Filippou 2017

3
そして、あなたは2018を使用している"StackAction.resetは(...)"の代わりに"NavigationActions.resetは(...)"を参照してくださいreactnavigation.org/docs/en/stack-actions.html
マヌエル

1
「index:1」を使用すると、「未定義のキーを読み取れません」。したがって、このエラーを修正するために、「index:0」を使用します。私はそれが理にかなっていると思います
Mauricio Pastorini 2018

1
APIが再び改善されたようですが、少なくともv5では、リセットアクションを実行する方法が短くなっています:reactnavigation.org/docs/navigation-prop#reset
AndyO

36

this.props.navigation.replace( "HomeScreen" )代わりに使用することを検討しましたかthis.props.navigation.navigate( "HomeScreen" )

このようにして、スタックに何も追加しません。そのため、Androidで戻るボタンを押したり、IOSで画面を右にスワイプしたりしても、HomeScreenは何も振って戻ることはありません。

詳細については、ドキュメントを確認してください。そしてもちろん、あなたが設定することで、戻るボタンを非表示にすることができますheaderLeft: nullnavigationOptions


replaceを使用してパラメータを渡すことはできません。
DeepakPathak20年

18

私たちは、偽を設定する必要があるgesturesEnabledと一緒にheaderLeftしますnull。画面をスワイプして戻ることもできるからです。

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

17

を使用して戻るボタンを非表示にすることができますleft:nullが、Androidデバイスの場合、ユーザーが戻るボタンを押したときに戻ることができます。ナビゲーション状態をリセットし、ボタンを非表示にする必要がありますleft:null

ナビゲーション状態をリセットするためのドキュメントは次のとおりです:https
//reactnavigation.org/docs/navigation-actions#reset

このソリューションは、のために働くんreact-navigator 1.0.0-beta.7しかし、left:nullもはや最新バージョンで動作します。


6
iOSでも、画面の端からスライドして元に戻すことができます。ナビゲーション状態のリセットは絶対に必要です。
cameronmoreau 2017

11

reactnativeからBackHandlerを使用することは私のために働いた。ComponentWillMountに次の行を含めるだけです。

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

それはAndroidデバイスの戻るボタンを無効にします。


これは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

react-navigationバージョン> = 1.0.0-beta.9

navigationOptions:  {
   headerLeft: null
}

3

この状況を処理するための最良のオプションは、Reactナビゲーションが提供するSwitchNavigatorを使用することです。SwitchNavigatorの目的は、一度に1つの画面のみを表示することです。デフォルトでは、バックアクションを処理せず、スイッチを切るとルートがデフォルトの状態にリセットされます。これは、認証フローで必要とされる正確な動作です。

これは、それを実装するための典型的な方法です。

  1. 2つのスタックナビゲーターを作成します。1つは認証(サインイン、サインアップ、パスワードを忘れたなど)用で、もう1つはメインAPP用です。
  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,
    }  
}

2

Typescriptを使用した最新バージョンのReactNavigation 5の場合:

<Stack.Screen
    name={Routes.Consultations}
    component={Consultations}
    options={{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

ReactNavigation v 5.0-スタックオプション:

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

あなたがしていることを常にあなたの答えに記述してください。更新または削除する必要があります。読む答えるためにどのようにあなたがより多くの答えを提供する前に^^
finnmglas

0

追加するだけで簡単だと思いますheaderLeft : null。react-nativecliを使用しているので、これが例です。

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
headerLeft: null

これは最新のreactNativeバージョンでは機能しません

そのはず:

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

Typescriptの場合:

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

0

react-navigationバージョン5.xでは、次のように実行できます。

import { CommonActions } from '@react-navigation/native';

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

あなたはここでもっと読むことができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.