首页 > 其他分享 >React Native 桥接原生模块

React Native 桥接原生模块

时间:2023-04-24 17:37:01浏览次数:36  
标签:原生 AppModule 桥接 JS React 模块 import 方法 Native

原生模块简介

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

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

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

  • 复杂、高性能组件:复杂表格、视频播放等;
  • 原生层开发能力:传感器编程、widget等;
  • 平台属性:系统信息、设备信息等;
  • 对接三方应用:相机、相册、地图等;

 

桥接原生方法

◆ 编写并注册原生层方法

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 (
    <View style={styles.root}>
      <Button
        title="桥接原生方法"
        onPress={() => {
          // 从原生模块中取出前面注册好的 AppModule,该模块的名称为 CustomApp
          const {CustomApp} = NativeModules;
          // 调用原生模块的方法
          CustomApp?.openGallery();
        }}
      />
    </View>
  );
};

const styles = StyleSheet.create({
  root: {
    width: '100%',
    height: '100%',
  },
});

 

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

 

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

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

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

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

 

JS 层读取版本名称

 

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

 

 

桥接原生常量

 

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

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

 

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

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

 

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

 

标签:原生,AppModule,桥接,JS,React,模块,import,方法,Native
From: https://www.cnblogs.com/rogerwu/p/17350113.html

相关文章

  • React、Ant Design 5.0 构建通用后台管理系统 - 接口服务环境搭建
    目录项目初始化项目结构package.jsontsconfig.jsonnodemon.jsonindex.tssrc/server.ts运行项目初始化mkdirgeneral-admin-system-servercdgeneral-admin-system-servernpminit-ynpminstalltypescriptts-node@types/nodenodemon@swc/core@swc/helpersregenerator-......
  • React、Ant Design 5.0 构建通用后台管理系统 - 登录页面
    目录安装依赖main.tsxsrc/styles/global.cssApp.tsxsrc/pages/user/Login/index.tsxsrc/pages/user/Login/style.module.css安装依赖npminstallantd@ant-design/icons@ant-design/pro-componentsAntDesign组件库@ant-design/pro-components封装一些好用的常用组件库mai......
  • SpringBoot+React 前后端分离
    SpringBoot+React前后端分离写个转发数据的小工具,本来只想开个SpringBoot服务带个页面,但感觉有点难受,正好之前研究了React,尝试一下前后端分离。后端简单用SpringBoot起个服务,写个接口处理请求:@RestController@RequestMapping("/data")publicclassDataController{......
  • react
    React是一个用于构建用户界面的JAVASCRIPT库。React主要用于构建UI,很多人认为React是MVC中的V(视图)。React起源于Facebook的内部项目,用来架设Instagram的网站,并于2013年5月开源。React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。1.......
  • 日志门面、实现框架和桥接器及实际使用
      之前总是在项目中使用现成的日志框架,用着方便就不会去思考它的框架、发展和组成,别人怎么用我也怎么用。感觉就是很模糊不清楚,说不知道也知道点,说知道又讲不明白,看了不少文章,决定把这一块梳理一下。1、现有日志的组成  可能说到日志,大家都知道一部分,什么slf4j、logback等等......
  • react18中antd的Upload组件上传头像,并且拿到服务器返回的头像的url地址在页面中显示头
    业务需求:上传头像,上传完毕后拿到头像的url,把头像展示在页面中,最终把头像url和其他用户信息一起发送给服务器 上传头像流程 导入Upload组件和图标(一个加号,一个加载中)import{Upload}from'antd';import{PlusOutlined,LoadingOutlined}from'@ant-design/ic......
  • vscode中react组件
    title:"vscode中ES7+React/Redux/React-Nativesnippets插件使用"date:2023-04-0723:21:32tags:['Vscode','插件']categories:["工具篇"]通过使用这个插件我们可以很方便的进行组件/方法/文件的导入本篇博客仅对插件进行介绍翻译,便于自己以后使用常用片段列表imr:......
  • React+hook+ts+ant design封装一个具有编辑和新增功能的页面
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷微信公众号前端小歌谣需求分析在前端项目中最常......
  • 部署Spring Boot + React前后端分离中的奇特发现
    今天在尝试在服务器上部署SpringBoot+React前后端分离应用时有一个奇特的发现。服务器首先是前端npmrunbuild之后,将构建好的应用移动到/var/www/html文件夹,nginx启动可以正常访问,axios接口访问地址为localhost:8080;后端maven构建并运行。本地电脑同样开始运行前后端。......
  • ReactNative 打包发布 Android 应用
    一、创建应用签名1、在AndroidStudio菜单栏中,依次点击Build >GenerateSignedBundle/APK 2、在Generate SignedBundleorAPK对话框中,选择APK,点击Next按钮 3、在Keystorepath字段下,点击Createnew按钮 4、在NewKeyStore窗口中,点击右侧文件......