React Native原生模組的基本使用
阿新 • • 發佈:2019-02-04
有時候React Native不能滿足我們對app的需求,我麼需要原生的程式碼來封裝控制元件。
以簡單Toast控制元件為例:
1.首先建立一個原生模組(繼承了ReactContextBaseJavaModule的Java類)。在此類中實現Toast的顯示方法。
package com.demo; import android.content.Context; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; public class MyNativeModules extends ReactContextBaseJavaModule { private Context context; public MyNativeModules(ReactApplicationContext reactContext) { super(reactContext); context = reactContext; } //ReactContextBaseJavaModule要求派生類實現getName()方法, 返回的是字串名字, // 這個名字在JavaScript端標記這個模組。注意:RN中已經內建了ToastAndroid的模組,所以練習時不要使用 //這個名字否則會出錯。 @Override public String getName() { return "MyNativeModule"; } //Toast的show方法 @ReactMethod //要匯出一個方法給JavaScript用,Java方法需要使用註解:@ReactMethod,返回型別必須為void public void rnCallNative(String msg) { Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); } }
2.註冊模組。我們需要在應用的package類的createNativeModules方法中新增這個模組。
package com.demo; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MyReactPackage implements ReactPackage { //把我們要匯出的模組放在modules中 @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new MyNativeModules(reactContext)); return modules; } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
3.在MainApplication中把我們寫好的package加入到getPackages()方法中,其他的不需要改動
package com.demo; import android.app.Application; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), //新增我們建立好的package new MyReactPackage() ); } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } }
4.在RN中的使用:
首先import NativeModules: import {NativeModules} from ‘react-native’
呼叫:NativeModules.MyNativeModule.rnCallNative('hello world');