Android跳转到RN页面 由于主客是以插件化的方式集成功能插件的,所以在主客中Android跳转到RN页面需要plugin、module和component。plugin、module不过多解释,component对应的是具体的js页面,要成功启动此页面,需要在对应的RN二方库中注册此页面。例如:
AppRegistry.registerComponent(‘MyDoctors’, () => MyDoctors); 注:至于为什么写一个RN的Component,然后系统就能启动,可以自己新建一个RN的工程,然后看下React Native启动流程分析。
Android与RN页面的交互 普通流程 RN如何调用原生Android的原生功能 rn调用原生的Android功能分为以下几步:
1,自定义原生实现类;
2,注册实现类;
3,RN的js部分调用原生;
首先,创建一个继承ReactContextBaseJaveModule的抽象类,此抽象类需要重写getName()函数用于返回一个字符串,这个字符串会在JavaScript端标记使用的模块。然后,可以编写一个函数暴露给javascript端,并且这个函数需要使用注解@ReactMethod进行标记。由于React Native的跨语言访问是异步进行的,所以想要给JavaScript返回一个值的唯一办法是使用回调函数或者发送事件。
例如,SomeModule:
package com.untitled;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import javax.annotation.Nonnull;
public class SomeModule extends ReactContextBaseJavaModule {
public SomeModule(@Nonnull ReactApplicationContext reactContext) {
super(reactContext);
}
@Nonnull
@Override
public String getName() {
return "SomeModule";
}
@ReactMethod
public void callbackMethod(String paramsFromJS, Callback ok, Callback error) {
boolean result = true;
if (result) {
ok.invoke("callback ok");
} else {
error.invoke("callback ok");
}
}
@ReactMethod
public void promiseMethod(String paramsFromJS, Promise promise){
boolean result = true;
if (result) {
promise.resolve("promise ok");
} else {
promise.reject("promise error");
}
}
}
然后,需要创建一个实现类用于实现ReactPackage接口,该接口中有三个抽象函数需要实现,分别是createNativeModules,createJSModules,createViewManagers。其中,ReactPackage实现类最关键的函数就是createNativeModules,在该函数中我们需要添加前一步创建的ReactContextBaseJavaModule子类用于构建ReactInstanceManager的实例,并通过调用 addPackage()函数,将上一步实现的ReactPackage添加进去。
例如,SomeReactPackage:
public class SomeReactPackage implements ReactPackage {
@Nonnull
@Override
public List createNativeModules(@Nonnull ReactApplicationContext reactContext) {
List modules=new ArrayList();
SomeModule module = new SomeModule(reactContext);
modules.add(module);
return modules;
}
@Nonnull
@Override
public List createViewManagers(@Nonnull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
public List
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?