React Native开发中少不了调用原生模块,本文以Toast为例介绍如何调用Android Toast模块.
官方文档:http://reactnative.cn/docs/0.39/native-modules-android.html#content
主要分为四个步骤:
第一步 创建模块类
在android/app/src/main/java/(包名)目录下,创建一个ToastModule.java的类
注意包名不要弄错了!!!
package com.jdapp; //包名
import android.widget.Toast; //引入调用的类
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;
import java.util.Map;
import java.util.HashMap;
public class ToastModule extends ReactContextBaseJavaModule {
private static final String DURATION_SHORT_KEY = "SHORT";
private static final String DURATION_LONG_KEY = "LONG";
public ToastModule(ReactApplicationContext reactContext) {
super(reactContext);
}
// 复写方法,返回react-native中调用的 组件名
@Override
public String getName() {
return "ToastNative";
}
// 复写方法,返回常量
@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注解返回react-native中可调用的 方法
@ReactMethod
public void show(String message, int duration) {
Toast.makeText(getReactApplicationContext(), message, duration).show();
}
}
第二步 注册模块
在android/app/src/main/java/(包名)目录下,创建一个ExampleReactPackage.java的类
注意包名不要弄错了!!!
package com.jdapp;
import android.widget.Toast;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ExampleReactPackage implements ReactPackage {
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new ToastModule(reactContext));
return modules;
}
}
第三步 添加注册类
将步骤2创建的ExampleReactPackage添加到 MainApplication.java
中的 getPackages()
方法中
第四步 封装成JavaScript模块
为了让你的功能从JavaScript端访问起来更为方便,通常我们都会把原生模块封装成一个JavaScript模块。这不是必须的,但省下了每次都从NativeModules
中获取对应模块的步骤。这个JS文件也可以用于添加一些其他JavaScript端实现的功能。
创建ToastAndroid.js
/**
* This exposes the native ToastAndroid module as a JS module. This has a function 'show'
* which takes the following parameters:
*
* 1. String message: A string with the text to toast
* 2. int duration: The duration of the toast. May be ToastAndroid.SHORT or ToastAndroid.LONG
*/
import { NativeModules } from 'react-native';
// 下一句中的ToastAndroid即对应上文
// public String getName()中返回的字符串
// 练习时请务必选择另外的名字!
export default NativeModules.ToastAndroid;
最后就是调用了.
先引入
import ToastAndroid from './ToastAndroid';
调用
ToastAndroid.show('AAA',ToastAndroid.SHORT);