React Native 桥接原生模块|世界热资讯

博客园   2023-04-24 22:03:31

原生模块简介

有时候一个 RN 应用需要访问一个原生平台的 API 比如相机,但是,默认情况下 JavaScript 是无法访问原生 API 的。


(资料图)

原生模块系统暴露了一些 Java 类的实例对象给 JavaScript,这样就可以允许开发者在 JS 代码中执行一些特定的原生代码。

简单来说,桥接原生就是为了实现 react 层 JS 实现不了的需求,比如:

桥接原生方法

编写并注册原生层方法

1、使用 Android Studio 编辑器依次找到 android > app > src > main > java > com.rndemo (RN应用的项目名称)> MainApplication.java

找到 getPackages这个方法,可以看到该方法返回的是 ReactNative 桥接的各种包,当前还没有添加任何自定义的包

2、在上一步的 com.rndemo 这个包下新建一个 rn 文件夹,然后在 rn 目录下新建一个 RnDemoPackage.java

3、新建好的这个类需要实现 ReactPackage接口,该接口会重写两个方法 createNativeModulescreateViewManagers

createNativeModules:用来导入 RN 原生模块

createViewManagers:用来导入 RN 原生组件

4、从图中可以看到 createNativeModules方法返回的是一个原生模块(NativeModule)的集合,因此,这里先新建一个原生模块,取名为 AppModule.java

该类需要继承 ReactContextBaseJavaModule,并且重写 getName方法

同时,AppModule还需要一个构造函数,这里可以同时按住键盘 Alt + Insert,在弹出的窗口中选择 Constructor

Choose Super Class Constructor窗口中提供了 2 个构造函数,这里选择第 2 个带参的构造函数

5、假如 AppModule这个原生模块需要给 JavaScript 暴露一个打开手机相册的方法,这里可以给 AppModule添加一个 openGallery方法,并且添加注解 @ReactMethod用来修饰 JS 调用的原生方法

至于方法中使用到的 DeviceUtil 这个工具类是我们提前准备好的,其位置在 rn 同级的 utils 目录下

最终原生模块 AppModule 的代码如下

package com.rndemo.rn;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;import com.rndemo.utils.DeviceUtil;public class AppModule extends ReactContextBaseJavaModule {    public AppModule(@Nullable ReactApplicationContext reactContext) {        super(reactContext);    }    @NonNull    @Override    public String getName() {    // 返回原生模块注册时的名称,也就是说从 react 层的 js 代码中调用 AppModule 这个原生模块,必须先知道这个模块叫什么名称    // 这里约定 AppModule 原生模块暴露的名字叫 CustomApp,也可以叫其它的        return "CustomApp";    }    @ReactMethod    public void openGallery() {        // 判空        if (getCurrentActivity() == null) {            return;        }        DeviceUtil.openGallery(getCurrentActivity());    }}

6、回到上一步新建的 RnDemoPackage类中,createNativeModules这个方法返回的是一个原生模块(NativeModule)的集合,这里可以将刚才注册好的 AppModule注册进来

7、最后,回到 MainApplication.java,把 RnDeomoPackage注册进去

◆JS 层调用原生方法

可以从 NativeModules中取出注册好的原生模块,调用原生模块的方法

import React from "react";import {StyleSheet, View, Button, NativeModules} from "react-native";export default () => {  return (          

上例中,点击按钮就会读取相册,由于谷歌模拟器的效果不是很直观,这里直接展示手机模拟器的效果图

原生模块暴露带返回值的方法

上面的示例中,提供了一个没有返回值的 getGallery 方法供 JS 层调用,那如果有返回值的方法该怎么写呢?

这里需要特别注意一点,从 JS 层调用原生层的方法是一个异步的过程,所以,原生层中带返回值的方法不能直接返回,而是要用 Promise 来实现

原生层提供一个返回应用版本名称的方法 getVersionName

JS 层读取版本名称

重启项目以后,运行效果如下图

桥接原生常量

◆ 编写并注册原生常量方法

在 AppModule 原生组件中重写一个 getConstants方法

◆ JS 层获取原生常量(同步获取)

在 JS 层可以直接读取原生组件的常量,无需异步获取

重启项目以后,运行效果如下图

相关新闻

猜你喜欢

React Native 桥接原生模块|世界热资讯

2023-04-24

韩国监管机构将对银行进行压力测试 以确保金融稳定_简讯

2023-04-24

消息称微软高管对Xbox部门表现不满-当前快看

2023-04-24

快手创始人宿华成立创智探索公司

2023-04-24

成都住房公积金实现主要业务场景数字人民币应用全覆盖

2023-04-24

堂吉诃德故事梗概 堂吉诃德故事梗概400字

2023-04-24

世界聚焦:瑞信事件有何教训?日本官员:银行资本充足也会“遭殃” 商业模式才是信心关键

2023-04-24

微信绑银行卡可以绑别人的吗(微信绑银行卡可以绑别人的卡吗) 天天动态

2023-04-24

杭州新增一区全域放宽限购 外地户籍只需1个月社保可购房

2023-04-24

美瑞新材: 独立董事关于第三届董事会第九次会议相关事项的独立意见

2023-04-24

2023年一季度小额贷款公司统计数据报告

2023-04-24

世界新资讯:大公关注第一创业证券股份有限公司变更主要股东获得中国证监会核准批复

2023-04-24

学龄人口减少,韩国拟削减中小学教师招聘规模 世界速递

2023-04-24

盛行西风什么意思_盛行机箱 独家

2023-04-24

眼角长脂肪粒是什么原因造成的_眼角长脂肪粒的原因

2023-04-24

超卓航科(688237)4月24日主力资金净卖出733.93万元

2023-04-24

扬州至上海高速自驾车(扬州至上海高速自驾车费用)-世界信息

2023-04-24

资讯推荐:小说丨苏大平:世间温暖

2023-04-24

浙江省舟山市市场监管局食品安全监督抽检信息公示(2023年第7期)

2023-04-24

一张图:2023/04/24黄金原油外汇股指"枢纽点+多空占比"一览|速看

2023-04-24

私募新观察 | 实业跨界“创投圈”热情不减 把握机会与防控风险缺一不可|今日热议

2023-04-24

嘉兴金庸图书馆将拆除?官方最新通报 当前热门

2023-04-24

天天信息:徐工多个“大国重器”亮相

2023-04-24

世界今日讯!昔日千亿平台董事长获刑20年!曾花213万与史玉柱午餐

2023-04-24

东吴证券给予上峰水泥增持评级,2022 年年报及 2023 年一季报点评:水泥主业景气筑底,两翼业务贡献新增长极_当前速读

2023-04-24

精彩图集