React Native 桥接原生原子组件

news/2025/2/23 2:14:52/

一、实现一个原生自定义组件 InfoView

1、新建一个package 包 view 和一个 class 类 InfoView ,InfoView 继承自类 LinearLayout ,LinearLayout 类提供了布局管理功能。

在这里插入图片描述

package com.awesomeproject.view;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;import com.awesomeproject.R;public class InfoView extends LinearLayout {public InfoView(Context context) {super(context);initView();}// 初始化视图的方法private void initView() {}}

2、初始化视图,首先要有一个视图,在 res 目录下有一个 layout 文件夹(没有的话可以创建一个),再新建一个布局视图的XML 文件 layout_info_view.xml 。
在这里插入图片描述
使用拖动或者手写的方式编写一个自定义的视图组件
在这里插入图片描述
3、xml 文件编写好后,就可以在类 InfoView 中初始化视图,将 XML 转化为 View 对象以待使用。
在这里插入图片描述

二、创建ViewManager,用于接管原生自定义组件的属性和行为,并把ViewManager注册到ReactPackage中。

1、新创建一个包(package)viewmanager ,再新建一个类 InfoViewManager ,这个类继承自 SimpleViewManager 将视图组件 InfoView 托管给 InfoViewManager 管理。

SimpleViewManager 是 React Native 中用于管理自定义原生视图的基类之一。React Native 允许开发者通过 JavaScript 创建和管理原生组件,而 SimpleViewManager 则提供了一种相对简单的方式来创建和管理原生视图。

管理原生视图的创建和视图的属性: createViewInstance 方法中返回一个新的原生视图实例,可以定义原生视图的属性,这些属性可以在 JavaScript 中进行设置。

处理属性的变化: 原生视图的属性可以在运行时更改,可以通过重写 updateView 方法来处理这些属性的变化。这使得在 JavaScript 中更新原生组件的属性时,相关的原生视图也能够相应地更新。

处理命令: SimpleViewManager 也提供了 receiveCommand 方法,用于处理从 JavaScript 发送的命令。这就可以在原生端执行一些操作,例如触发某个事件或执行一些特定的操作。

事件处理: 通过重写 getExportedCustomBubblingEventTypeConstants 和 getExportedCustomDirectEventTypeConstants 方法,可以定义原生视图支持的事件类型,以便在 JavaScript 中监听这些事件

在这里插入图片描述

2、 InfoView 注册到 InfoViewManager 中后,再将 InfoViewManager 注册到 SmallDaysPackage 里面,最后 SmallDaysPackage 又会被注册到 MainAppLication 中,最终实现桥接组件对象。

在这里插入图片描述

在 JS 层导入原生组件,并封装导出 JS 模块

在 JS 层将原生组件通过 requireNativeComponent 方法导入,封装一个公共组件使用。

组件名是类 InfoViewManager 中 getName 方法返回的,即 NativeInfoView。

在业务组件中使用

在这里插入图片描述

如果在 JS 层没有显示原生组件也没报错,可能是由于没有在 style 中给定宽高
另外每次修改完原生代码都必须重启应用,才能生效

实现效果:

在这里插入图片描述

相关链接:
React Native 桥接原生实现 JS 调用原生方法
React Native 桥接原生常量


http://www.ppmy.cn/news/1300342.html

相关文章

创建ROS模型与小机器人地图规划

1、打开自己的VM系统 2、安装小机器人的安装包,输入如下命令,回车输入密码(自己设的): sudo apt install ros-noetic-turtlebot3-simulations ros-noetic-turtlebot3-slam ros-noetic-turtlebot3-navigation 提示我之前安装过了 3、用rosla…

react中概念性总结(三)

目录 React中事件绑定函数的方法有哪些? 函数如何传递参数? 什么是重绘与回流,触发条件,如何减少回流和重绘 React 生命周期中 getDerivedStateFromProps怎么使用,怎么理解? React中路由单页面应用的优缺点都有哪些…

uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题

需求:要在app上的顶部导航提示哪里添加一些东西进去,用uniapp自带的肯定不行啊,所以自定义了所有的页面的顶部导航,之后自定义后用手机调试发现 uni.getMenuButtonBoundingClientRect()这个方法的top获取不到....网上找了很多种方…

【ChCore Lab 00】ChCore Lab 环境简单搭建

[实验环境]: OS: Ubuntu 22.04 LTS 1. 搭建编译和运行环境 实验环境至少需要 arm-gcc、docker 其中之一或者 qemu。首先 git 是必不可少的。 sudo apt-get install git -y安装交叉编译工具链。 sudo apt-get install gcc-aarch64-linux-gnu安装lab运…

docker部署simpleDocker

1,安装docker,请参考 linux安装docker 2,安装docker-compose,请参考 Docker-Compose 3,安装simpleDocker 准备docker-compose.yml文件 version: 3 services:redis:container_name: redisimage: redis:latestweb:conta…

【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑

“日志与性能监控:Java开发者的得力助手 前言 在现代软件开发中,日志记录和性能监控是确保应用程序健康运行的不可或缺的组成部分。为了满足开发者对灵活性和性能的需求,Java 社区涌现出多个强大的库,本文将深入探讨其中几个关键…

Ubuntu系统中指定端口防火墙状态查询与操作

浏览器访问: 如果遇到如山图所示的情况,既有可能是防火墙的问题。具体解决方案参照如下: 1.指定端口的防火墙状态查询 (1)查询命令 sudo ufw status | grep 8081/tcp #其中8081为要查询的端口号 如果端口是打开的…

列表进入详情页的传参问题(vue的问题)

<router-link :to"{path: detail, query: {id: 1}}">前往detail页面</router-link> c页面的路径为http://localhost:8080/#/detail?id1&#xff0c;可以看到传了一个参数id1&#xff0c;并且就算刷新页面id也还会存在。此时在c页面可以通过id来获取对应…