1. 程式人生 > >React-navigation的回撥跳轉

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');

可以參考這篇部落格