You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native应用按下返回键直接退出问题求助(SDK更新后)

解决React Native SDK更新后返回键直接关闭应用的问题

问题现象

SDK更新前应用运行正常,更新后iOS(通过Expo测试)和Android设备按下返回键会直接关闭应用,无法触发原本的退出确认弹窗。

原因分析

@react-navigation/native 或其依赖更新后,导航容器的默认返回键处理逻辑优先级高于全局的BackHandler监听,导致自定义的退出确认逻辑被覆盖。此外原代码未判断当前页面路由状态,无论在哪一页按下返回键都会触发退出确认,不符合正常导航逻辑。

修复方案

通过获取导航容器的引用,判断当前是否处于根路由,再决定执行退出确认还是默认返回行为:

修改App.js代码如下:

// App.js
import React, { useEffect, useRef } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import AppNavigator from './AppNavigator';
import { BackHandler, Alert } from 'react-native';

const App = () => {
  const navigationRef = useRef(null);

  useEffect(() => {
    const backAction = () => {
      // 获取当前活跃的路由名称
      const currentRoute = navigationRef.current?.getCurrentRoute()?.name;
      
      // 仅在根页面(MainPage)触发退出确认
      if (currentRoute === 'MainPage') {
        Alert.alert("Hold on!", "Are you sure you want to go back?", [
          {
            text: "Cancel",
            onPress: () => null,
            style: "cancel"
          },
          { text: "YES", onPress: () => BackHandler.exitApp() }
        ]);
        return true; // 阻止系统默认返回行为
      }
      
      // 非根页面,执行正常返回上一页逻辑
      navigationRef.current?.goBack();
      return true;
    };

    const backHandler = BackHandler.addEventListener('hardwareBackPress', backAction);

    return () => backHandler.remove();
  }, []);

  return (
    <NavigationContainer ref={navigationRef}>
      <AppNavigator />
    </NavigationContainer>
  );
};

export default App;

补充说明

  • 确保你的@react-navigation/native版本为v6及以上(getCurrentRoute()方法仅在该版本及以上支持)
  • 修复后逻辑更合理:仅在根页面触发退出确认,其他页面按下返回键正常返回上一页
  • 若使用Expo,可通过expo doctor命令检查依赖版本兼容性,避免因版本不匹配引发其他问题

内容的提问来源于stack exchange,提问作者VladStefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:18