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

Leo*_*elo 6 react-native react-navigation react-navigation-v5

你好!

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

路线

  • 主页:我不想离开应用程序
  • 成功:我不想返回 Checkout。

示例:点击此处

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;

Run Code Online (Sandbox Code Playgroud)
import React from 'react';
import { View} from 'react-native';

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

export default Success;
Run Code Online (Sandbox Code Playgroud)

Bas*_*den 9

您可以执行以下操作:

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

      BackHandler.addEventListener('hardwareBackPress', onBackPress);

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

      BackHandler.addEventListener('hardwareBackPress', onBackPress);

      return () =>
        BackHandler.removeEventListener('hardwareBackPress', onBackPress);
    }, []),
  );
  // ...
};
Run Code Online (Sandbox Code Playgroud)

我已经将其设置为在调用事件时单击Home屏幕上的返回不会执行任何操作。truehardwareBackPress

对于Success屏幕,我导航回Home.

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


useFocusEffect重要的是,无论你在哪里使用react-navigation,都不要忘记导入它:

import { useFocusEffect } from '@react-navigation/native';
Run Code Online (Sandbox Code Playgroud)

何时返回truefalsehardwareBackPress事件处理函数中在反应导航文档中进行了解释:

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

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