React-navigation的回调跳转

源码在此:传送门


Android中界面跳转传值我们用到了Bundle或者接口回调的方式,而React Native中界面跳转是什么样的呢?这篇博客就详细讲讲react-navigation跳转回调的实现方式


先看一下案例图:

视频播放到一定进度弹出分享选择框,点击分享后才能继续播放

需要准备

案例中运用到的React Native依赖库有:
react-navigationreact-native-video
安装和使用步骤可以参考我的这两篇博客:
react-navigation使用攻略react-native-video使用攻略

案例分析

首先详细分析下上面gif图的需求:在视频界面需要监听播放进度,到达20%进度的时候弹出提示框,如下:
分享提示框
视频界面(以下简称:页面1)中点击分享后跳转至分享界面(以下简称:页面2),分享界面中按物理键Back或者点击回退箭头可以会退到页面1,页面1就可以继续播放了。

实现思路

首先页面1跳转页面2后,要设置对页面2的监听,页面2跳转回页面1,也就是goBack时候返回参数,这个要用到回调跳转的思路实现

实现方法

步骤一:
在页面1中创建一个方法:

returnTag: (tag) => {
      this.setState({tag: tag});
}

步骤二:
跳转页面的时候将该方法作为参数,传递给页面2:

this.props.navigation.navigate('Share', {
      returnTag: (tag) => {
      this.setState({tag: tag});
      }
});

步骤三:
在页面2中goBack方法中创建如下功能:

this.props.navigation.state.params.returnTag(2);
this.props.navigation.goBack();

这样页面1就能拿到页面2所传过来的值,然后作为一个标签tag决定视频是否继续播放!

关键的代码如下:
页面1:

 if (data.currentTime > this.state.duration * 0.2 && this.state.tag !== 2) {
            this.setState({paused: !this.state.paused});
            Alert.alert('您需要分享App才能继续观看视频哦', '请选择', [
                {
                    text: '取消', onPress: () => {
                        this.props.navigation.goBack();
                        this.setState({
                            paused: this.state.paused
                        })
                    }
                },
                {
                    text: '分享', onPress: () => {
                        this.props.navigation.navigate('Share', {
                            returnTag: (tag) => {
                                this.setState({tag: tag});
                            }
                        });
                    }
                },
            ]);
        }

这段代码是执行在Video的回调函数中,视频播放过程中每个间隔进度单位(通常不足一秒,你可以打印日志测试下)调用的回调。

页面2:

componentWillMount() {
    BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid);
}

componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.onBackAndroid);
}

onBackAndroid = () => {
    const {navigate, goBack, state} = this.props.navigation;
    state.params.returnTag(2);
    goBack();
    // this.props.navigation.state.params.returnTag(2);
    // this.props.navigation.goBack();
    return true;
};
补充

跳转页面时,可以传值跳转和正常跳转(也就是不携带任何参数)
传值跳转:

this.props.navigation.navigate('Two', {data:this.state.data});

正常跳转

this.props.navigation.navigate('Two');

可以参考这篇博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值