React Native原生模块的基本使用

来源:互联网 发布:淘宝借贷利息 编辑:程序博客网 时间:2024/05/31 19:02

有时候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');



原创粉丝点击