ปิดใช้งานปุ่มย้อนกลับในการนำทางตอบสนอง


87

ฉันใช้ react native navigation (react-navigation) StackNavigator เริ่มต้นจากหน้าเข้าสู่ระบบตลอดวงจรชีวิตทั้งหมดของแอป ฉันไม่ต้องการมีตัวเลือกย้อนกลับกลับไปที่หน้าจอเข้าสู่ระบบ ไม่มีใครรู้ว่ามันซ่อนอยู่บนหน้าจอหลังหน้าจอล็อกอินได้อย่างไร? BTW ฉันซ่อนมันไว้ในหน้าจอเข้าสู่ระบบโดยใช้:

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) หากคุณต้องการล้างสแต็กการนำทาง:

สมมติว่าคุณอยู่บนหน้าจอที่คุณต้องการนำทางจาก:

หากคุณใช้ 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
คุณคือราชา
Dimitris Filippou

3
และเมื่อคุณอยู่ในปี 2018 ให้ใช้ "StackAction.reset (... )" แทน "NavigationActions.reset (... )" โปรดดูreactnavigation.org/docs/en/stack-actions.html
Manuel

1
"ไม่สามารถอ่านคีย์ของไม่ได้กำหนด" เมื่อใช้ "ดัชนี: 1" ดังนั้นเพื่อแก้ไขข้อผิดพลาดนี้ฉันใช้ "ดัชนี: 0" ฉันคิดว่ามันสมเหตุสมผล
Mauricio Pastorini

1
ดูเหมือนว่า API ได้รับการปรับปรุงอีกครั้งอย่างน้อยใน v5 ตอนนี้มีวิธีการรีเซ็ตที่สั้นกว่านี้: reactnavigation.org/docs/navigation-prop#reset
AndyO

36

คุณได้พิจารณาใช้this.props.navigation.replace( "HomeScreen" )แทนthis.props.navigation.navigate( "HomeScreen" ).

วิธีนี้จะทำให้คุณไม่ได้เพิ่มอะไรลงในสแต็ก ดังนั้น HomeScreen จะไม่โบกมืออะไรเพื่อย้อนกลับไปหากกดปุ่มย้อนกลับใน Android หรือเลื่อนหน้าจอไปทางขวาใน IOS

รายละเอียดเพิ่มเติมตรวจสอบเอกสาร และแน่นอนคุณสามารถซ่อนปุ่มย้อนกลับโดยการตั้งค่าheaderLeft: nullในnavigationOptions


คุณไม่สามารถส่งผ่านพารามิเตอร์โดยใช้การแทนที่
Deepak Pathak

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

11

การใช้ BackHandler จาก react native ได้ผลสำหรับฉัน เพียงรวมบรรทัดนี้ใน 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,
      }
    },
  },


3

ตัวเลือกที่ดีที่สุดในการจัดการกับสถานการณ์นี้คือการใช้ SwitchNavigator ให้โดยตอบสนองนำทาง จุดประสงค์ของ SwitchNavigator คือการแสดงทีละหน้าจอเท่านั้น โดยค่าเริ่มต้นจะไม่จัดการการกระทำย้อนกลับและจะรีเซ็ตเส้นทางเป็นสถานะเริ่มต้นเมื่อคุณเปลี่ยนไป นี่คือลักษณะการทำงานที่แน่นอนที่จำเป็นในขั้นตอนการพิสูจน์ตัวตน

นี่เป็นวิธีการทั่วไปในการนำไปใช้

  1. สร้างตัวนำทางสแต็ก 2 ตัว: หนึ่งตัวสำหรับการตรวจสอบสิทธิ์ (ลงชื่อเข้าใช้ลงทะเบียนลืมรหัสผ่าน ฯลฯ ) และอีกตัวสำหรับแอปหลัก
  2. สร้างหน้าจอที่คุณจะตรวจสอบเส้นทางจากสวิตช์นำทางที่คุณต้องการแสดง (ฉันมักจะตรวจสอบสิ่งนี้ในหน้าจอเริ่มต้นโดยตรวจสอบว่าโทเค็นถูกเก็บไว้ในที่จัดเก็บ Async หรือไม่)

นี่คือการใช้โค้ดของข้อความข้างต้น

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

สำหรับเวอร์ชันล่าสุด React Navigation 5 พร้อม typescript:

<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

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

สิ่งนี้จะใช้ไม่ได้ในเวอร์ชันเนทีฟตอบสนองล่าสุด

มันควรจะเป็น:

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.