在特定屏幕中禁用“后退”按钮(反应导航堆栈)

时间:2020-07-13 18:29:58

标签: react-native react-navigation react-navigation-v5

你好!

我需要禁用导航栏上的“后退”按钮。请帮我。

路线

  • 首页:我不想离开申请
  • 成功:我不想回到C​​heckout。

Example: click here

import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import { OrderProvider } from '../contexts/order';

import Home from '../pages/Home';
import Checkout from '../pages/Checkout';
import Success from '../pages/Checkout/success';

const AppStack = createStackNavigator();

const AppRoutes = () => (
  <OrderProvider>
    <AppStack.Navigator screenOptions={{ headerShown: false }}> 
      <AppStack.Screen name="Home" component={Home} />  <-- here
      <AppStack.Screen name="Checkout" component={Checkout} />
      <AppStack.Screen name="Success" component={Success} /> <--- here
    </AppStack.Navigator>
  </OrderProvider>
);

export default AppRoutes;

import React from 'react';
import { View} from 'react-native';

const Success = () => {
  return (
    <View />
  );
};

export default Success;

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

const Home = () => {
  useFocusEffect(
    React.useCallback(() => {
      const onBackPress = () => {
        return true;
      };

      BackHandler.addEventListener('hardwareBackPress', onBackPress);

      return () =>
        BackHandler.removeEventListener('hardwareBackPress', onBackPress);
    }, []),
  );
  // ...
};
const Success = ({navigation}) => {
  useFocusEffect(
    React.useCallback(() => {
      const onBackPress = () => {
        navigation.navigate('Home');
        return true;
      };

      BackHandler.addEventListener('hardwareBackPress', onBackPress);

      return () =>
        BackHandler.removeEventListener('hardwareBackPress', onBackPress);
    }, []),
  );
  // ...
};

我已经对其进行了设置,以使在Home事件被调用时返回true不会在hardwareBackPress屏幕上单击返回。

Success屏幕上,我导航回到Home

我认为这是您通过阅读问题来寻找的行为。


请务必不要忘记从中导入useFocusEffect,这一点很重要 随时随地使用反应导航:

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

在反应导航文档中说明了何时在true事件处理函数中返回falsehardwareBackPress的情况:

从onBackPress返回true表示我们已经处理了 事件,并且不会调用react-navigation的监听器,因此不会 弹出屏幕。返回false将导致事件冒泡 反应导航的侦听器将弹出屏幕。

如果您想了解更多信息,请阅读以下文档:https://reactnavigation.org/docs/custom-android-back-button-handling/