React Native之js呼叫Android原生使用Callback傳遞結果給js
阿新 • • 發佈:2018-12-10
1 問題
上面的文章只是呼叫安卓原生顯示Toast,但是我們一般會需要呼叫安卓的程式碼然後去拿回結果給js,但是我們知道在android層js呼叫的這個函式返回值必須的void,所以我們需要用到Callback,Callback一般用於同步,也就是說直接呼叫會直接返回結果,還有一個Promise用於非同步,比如我們安卓裡面需要寫網路請求啥的,等執行完了才返回結果.這裡先說Callback
@ReactMethod
public void methodName() {
}
2 使用Callback程式碼實現
的MyToastModule.java檔案增加下面這個方法
@ReactMethod
public void showMyName(Callback result) {
result.invoke("chenyu");
}
然後App.js檔案改定如下,增加了一個建構函式,然後給一個text賦了chenzixuan的值
/** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow */ import React, {Component} from 'react'; import {Platform, StyleSheet, Text, View, NativeModules} from 'react-native'; const instructions = Platform.select({ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', android: 'Double tap R on your keyboard to reload,\n' + 'Shake or press menu button for dev menu', }); var myAndroidToast = NativeModules.MyToast; type Props = {}; export default class App extends Component<Props> { constructor(props){ super(props); this.state={ myName:'chenzixuan', } } render() { return ( <View style={styles.container}> <Text onPress={()=> this._androidShowMsg()} style={styles.welcome}>Welcome to React Native!</Text> <Text style={styles.instructions}>To get started, edit App.js</Text> <Text style={styles.instructions}>{instructions}</Text> <Text style={styles.instructions}>{this.state.myName}</Text> </View> ); } /** *呼叫安卓原生程式碼 * @private */ _androidShowMsg = () => { myAndroidToast.showMyName((myName)=>{ this.setState({myName:myName}); }); }; } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });
3 執行結果
執行之前要記得在專案的目錄下執行下面的命令,它會在android的assets目錄下生成index.android.bundle檔案,也就是安卓會載入這個js檔案,這裡也會起到編譯js作用,如果有語法錯誤,這裡控制檯會提示
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
然後執行執行專案命令
react-native run-android
第一次執行結果圖片如下,下面顯示的是chenzixuan
然後我點選Welcome to React Native,下面就顯示chenyu了