react native 物理返回键Back踩的坑

本文讲述了在React Native项目中遇到的物理返回键导致应用闪退的问题。开发者尝试了各种解决方案,最终发现错误在于使用bind函数时传递了参数,导致函数被赋值而非绑定。修复方法是移除参数,确保绑定的是函数本身。这个问题让作者认识到深入理解基础知识的重要性。

react native 物理返回键实现资料网上很多,推荐官网给的,地址: https://reactnavigation.org/docs/en/redux-integration.html

现在来说说我的坑,因为这是以前的人员写的,他已经离职了,但是这个坑从我接手开始就一直存在,想着有时间再解决吧,现在快上线了,不能再拖了,看了他写的代码,感觉代码没毛病,但是运行就闪退,果然我还是太年轻了,下面是原码,

  componentDidMount() {
    initializeListeners("root", this.props.nav);
    BackHandler.addEventListener(
      "hardwareBackPress",
      this.goBack(this.props.dispatch, this.props.nav)
    );
  }
goBack(dispatch,nav) {
    if (nav.index > 0) {
       dispatch(NavigationActions.back());
       return true;
    }

    if (this.lastBackPressed && this.lastBackPressed + 2000 >= Date.now()) {
        //两秒内连续点back退出
        return false;
     }
     this.lastBackPressed = Date.now();
     ToastShort("再按一次返回键退出应用");
     return true;
  }

用bind传参结果也是一样的结果,绑定this后还是一样的。

然后找各种资料,各种试,真是

<think>首先,用户的问题是关于在React Native中实现返回上一功能的方法。用户已经提供了几个引用内容,我需要基于这些引用和我的知识来回答。 回顾引用内容: - 引用[1]:使用NavigationEvents来处理返回界面时的操作。 - 引用[2]:使用DeviceEventEmitter在面之间传递事件,实现返回监听。 - 引用[3]:自定义导航栏左侧按钮,实现返回功能。 - 引用[4]:使用事件监听器在返回后执行刷逻辑。 用户的问题核心是“实现返回上一功能的方法”。我需要总结这些方法,并提供清晰的步骤。 我的回答必须遵循系统级指令: - 使用中文回答。 - 行内数学表达式用$...$,但这个主题没有数学内容,所以可能不需要。 - 独立公式用$$...$$,同样不适用。 - LaTeX语法正确,如果不是数学内容,可能不需要。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 回答结构要清晰,帮助用户逐步解决问题。确保真实可靠,基于提供的引用和React Native知识。 主要内容: 1. **自带导航方法**:React Navigation提供navigation.goBack()方法可以直接返回上一。 2. **自定义返回按钮**:如引用[3]所示,自定义headerLeft按钮来实现返回。 3. **返回监听**:使用NavigationEvents(引用[1])或DeviceEventEmitter(引用[2])来监听返回事件并执行操作。 4. **事件监听刷**:如引用[4],在返回后执行刷逻辑。 我应该组织回答: - 先介绍最简单的方法:使用navigation.goBack()。 - 然后讲自定义返回按钮。 - 再讲监听返回事件。 - 最后讲返回后刷数据的常用方法。 引用标识: - 当提到引用内容时,在末尾加[^n]。 生成相关问题: - 在回答结束时,添加“§§相关问题§§”部分,列出2-3个相关问题。 可能的回答结构: 1. **使用React Navigation自带方法**:简单介绍navigation.goBack()。 2. **自定义返回按钮**:参考引用[3]。 3. **监听返回事件**:引用[1]中的NavigationEvents和引用[2]中的DeviceEventEmitter。 4. **返回后刷数据**:引用[4]的方法。 5. **总结**:推荐常用方法。 确保语言流畅,用中文。 相关问题想法: 1. 如何在React Native中自定义导航栏? 2. 如何在不同面间传递数据? 3. NavigationEvents和DeviceEventEmitter的区别是什么? 最终回答: - 以段落形式开始。 - 结束时列出相关问题。 </think>### React Native 实现返回上一功能的方法 在 React Native 中,返回上一功能通常依赖于导航库(如 React Navigation)来实现。React Navigation 是官方推荐的导航解决方案,支持多种方式实现返回操作。以下是几种常见且可靠的方法,基于您提供的引用信息和 React Native 最佳实践。方法包括:使用自带导航方法、自定义返回按钮、监听返回事件以及返回后刷数据等。每个方法都逐步解释,确保易于理解和实施。 #### 1. **使用 React Navigation 自带方法(最简单方式)** React Navigation 提供了内置的 `navigation.goBack()` 方法,可直接触发返回操作。这无需额外事件监听,适用于大多数场景。 - **步骤**: - 在目标面(如 B 面)中,通过 `this.props.navigation` 调用 `goBack()`。 - 示例代码: ```javascript import { TouchableOpacity } from 'react-native'; class ScreenB extends React.Component { handleGoBack = () => { this.props.navigation.goBack(); // 返回上一的核心方法 }; render() { return ( <TouchableOpacity onPress={this.handleGoBack}> <Text>返回上一</Text> </TouchableOpacity> ); } } ``` - **适用情景**:适用于按钮点击触发返回,无需复杂事件处理。 - **注意事项**:确保面已通过 `createStackNavigator` 或其他导航器配置导航属性。 #### 2. **自定义导航栏返回按钮(如引用[3]所示)** 如果需要自定义返回按钮(例如,替换默认箭头图标或添加额外逻辑),可以通过设置导航栏的 `headerLeft` 属性来实现。这常用于统一 UI 风格或添加返回前确认逻辑[^3]。 - **步骤**: - 在组件的 `navigationOptions` 中定义 `headerLeft`,绑定自定义函数。 - 利用 `this.props.navigation.setParams` 传递导航逻辑。 - 示例代码(基于引用[3]): ```javascript import React from 'react'; import { TouchableOpacity, Image } from 'react-native'; class CustomBackScreen extends React.Component { static navigationOptions = ({ navigation }) => ({ headerTitle: '自定义返回', headerLeft: ( <TouchableOpacity onPress={() => navigation.goBack()} style={{ padding: 10 }}> <Image source={require('./images/back-icon.png')} style={{ width: 20, height: 20 }} /> </TouchableOpacity> ) }); render() { return <Text>面内容</Text>; } } ``` - **适用情景**:当需要美化返回按钮或添加返回前逻辑(如数据保存)时。 - **注意事项**:在 Android 上可能需要处理硬件返回(参考引用[3]的 `BackHandler` 部分)。 #### 3. **监听返回事件并执行操作(如引用[1]和引用[2]所示)** 如果返回上一时需要触发特定逻辑(如刷数据或事件通知),可以使用 `NavigationEvents` 或 `DeviceEventEmitter` 来监听返回事件。推荐使用 `NavigationEvents`,因为它更简洁且与 React Navigation 集成度高[^1][^2]。 - **方法一:使用 NavigationEvents(推荐,基于引用[1])** - **优点**:无需手动管理事件订阅,适合返回后刷界面。 - **步骤**: - 导入 `NavigationEvents`。 - 添加 `onWillFocus` 或 `onDidFocus` 事件侦听器。 - 示例代码: ```javascript import React from 'react'; import { NavigationEvents } from 'react-navigation'; class ScreenA extends React.Component { handleFocus = () => { // 返回当前面时触发,执行刷操作 this.fetchData(); }; fetchData = () => { // 数据获取逻辑 }; render() { return ( <View> <NavigationEvents onDidFocus={this.handleFocus} // 面获得焦点时调用 /> <Text>面 A 内容</Text> </View> ); } } ``` - **适用情景**:返回后自动刷数据或更状态。 - **方法二:使用 DeviceEventEmitter(基于引用[2])** - **优点**:跨面事件传递灵活,适合复杂场景。 - **步骤**: - 在返回目标面(A 面)订阅事件。 - 在来源面(B 面)发射事件。 - 示例代码: ```javascript // A 面(接收返回事件) import { DeviceEventEmitter } from 'react-native'; class ScreenA extends React.Component { componentDidMount() { this.subscription = DeviceEventEmitter.addListener('onBackToA', (data) => { console.log('返回后事件触发,数据:', data); this.refreshData(); }); } componentWillUnmount() { this.subscription.remove(); // 清理监听 } refreshData = () => { // 刷逻辑 }; render() { return <Text>面 A</Text>; } } // B 面(触发事件) class ScreenB extends React.Component { handleGoBack = () => { this.props.navigation.goBack(); DeviceEventEmitter.emit('onBackToA', { key: 'value' }); // 返回前发射事件 }; render() { return ( <TouchableOpacity onPress={this.handleGoBack}> <Text>返回 A 面</Text> </TouchableOpacity> ); } } ``` - **适用情景**:需要在返回时传递数据或触发全局事件。 #### 4. **返回后刷数据(如引用[4]所示)** 针对返回上一后需要刷数据的场景,可以将事件监听与数据获取结合。使用 `EventEmitter` 模式确保逻辑解耦[^4]。 - **步骤**: - 在组件挂载时注册事件监听器。 - 在返回时触发事件调用数据刷函数。 - 示例代码: ```javascript import { bridge } from './customEventEmitter'; // 假设有自定义事件库 class PageA extends React.Component { componentDidMount() { this.listener = bridge.addListener('refreshAfterBack', () => { this._getData(); // 返回后执行的数据刷 }); } componentWillUnmount() { this.listener.remove(); // 清理资源 } _getData = () => { // 获取最数据 }; render() { return <Text>主面</Text>; } } // 在返回来源面(如 PageB)中触发事件 class PageB extends React.Component { handleBack = () => { this.props.navigation.goBack(); bridge.emit('refreshAfterBack'); // 返回前触发刷事件 }; render() { return ( <Button title="返回" onPress={this.handleBack} /> ); } } ``` - **适用情景**:电商应用返回购物车后更列表,或表单返回后重置状态。 #### 总结与推荐 - **推荐方法**:对于简单返回,优先使用 `navigation.goBack()`;对于返回后操作,首选 `NavigationEvents` 以简化代码。 - **注意事项**: - 确保使用最版本的 React Navigation(如 v5/v6),旧版语法可能不同。 - **性能提示**:在 `componentWillUnmount` 中清理事件监听,避免内存泄漏。 - **平台差异**:Android 需处理硬件返回(引用[3]),iOS 通常自动支持。 - **真实场景**:在电商应用中,返回后刷数据可显著提升用户体验[^4]。 通过以上方法,您可以灵活实现 React Native返回上一功能。如果需要更多示例代码或调试建议,请提供具体场景细节。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值