react-native 新增 Toast 模組
阿新 • • 發佈:2019-01-31
1.建立一個原生模組開始。一個原生模組是一個通常繼承 ReactContextBaseJavaModule
類的
Java 類,並且實現了 JavaScript 需要實現的方法
public class AliToastAndroid extends ReactContextBaseJavaModule { private static final String DURATION_SHORT_KEY = "SHORT"; private static final String DURATION_LONG_KEY = "LONG"; public AliToastAndroid(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "AliToastAndroid"; } @Override public Map<String, Object> getConstants() { final Map<String, Object> constants = new HashMap<>(); constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT); constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG); return constants; } @ReactMethod public void show(String message, int duration) { Toast.makeText(getReactApplicationContext(), message, duration).show(); } }
注意:
getName
的方法被實現。這個方法的目的就是返回在
JavaScript 裡面表示這個類的叫做 NativeModule
的字串的名字。在這裡我們呼叫 AliToastAndroid 因此我們可以在 JavaScript 裡面使用 React.NativeModules.AliToastAndroid來得到它。
2.一個可選的叫做 getConstants
的方法會將傳遞給
JavaScript 的常量返回。這個方法的實現並不是必須的,但是卻對在 JavaScript 和 Java 中同步的預定義的關鍵字的值非常重要。
3.給
JavaScript 暴露一個方法,一個 Java 方法需要使用 @ReactMethod
來註解。橋接的方法的返回值型別總是void
。React
Native 的橋接是非同步的,因此將一個結果傳遞給 JavaScript 的唯一方式就是使用回撥函式或者呼叫事件
2.註冊模組:
public class AnExampleReactPackage extends MainReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = super.createNativeModules(reactContext); //new an Array intstead of abstract List exception List<NativeModule> result = new ArrayList<>(); result.addAll(modules); result.add(new AliToastAndroid(reactContext)); return result; } }
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new AnExampleReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
3.在你的 JavaScript 檔案裡面你可以像下面這樣呼叫方法:
var AliToastAndroid = React.NativeModules.AliToastAndroid
AliToastAndroid.show('444444', AliToastAndroid.LONG);