react native 原生模塊橋接的簡單說明

原文出自:https://github.com/prscX/awes...
博客鏈接:https://ssshooter.com/2019-02...

Android

創建原生模塊包

  • 通過繼承 ReactPackage 為你的原生模塊包創建 Java 類,可以這么寫:
  • 覆蓋 createNativeModulescreateViewManagers 方法

public class MyNativePackage implements ReactPackage {@Overridepublic List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {}@Overridepublic List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {}
}
  • createNativeModules 方法中添加原生模塊
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();modules.add(new MyNativeModule(reactContext));return modules;
}
  • createViewManagers 方法中添加原生 UI 組件
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {List<ViewManager> components = new ArrayList<>();components.add(new RNNativeComponent());return components;
}

創建原生模塊

  • 先通過繼承 ReactContextBaseJavaModule 創建 MyNativeModule 類。
public class MyNativeModule extends ReactContextBaseJavaModule {public MyNativeModule(ReactApplicationContext reactContext) {super(reactContext);}
}
  • 為了讓 React Native 在 NativeModules 中找到我們的模塊,我們還需要覆蓋 getName 方法。
@Override
public String getName() {return "MyNativeModule";
}
  • 現在我們已經擁有一個可以導入到 JavaScript 代碼的原生模塊,現在可以向其中加入功能。
  • 暴露模塊方法:定義一個接受設置參數、成功回調和失敗回調的 Show 方法。
public class MyNativeModule extends ReactContextBaseJavaModule {@ReactMethodpublic void Show(ReadableMap config, Callback successCallback, Callback cancelCallback) {Activity currentActivity = getCurrentActivity();if (currentActivity == null) {cancelCallback.invoke("Activity doesn't exist");return;}}
}
  • 在 JavaScript 中調用模塊方法
import { NativeModules } from 'react-native'const { MyNativeModule } = NativeModulesMyNativeModule.Show({}, //Config Parameters() => {}, //Success Callback() => {} //Cancel Callback
)

注意:

  • 模塊方法只提供靜態引用,不包含于 react 樹中。

創建原生 UI 組件

  • 如果你需要在 react 樹中渲染一個原聲 UI 組件
  • 創建一個繼承 ReactNative ViewGroupManager 的 Java 類
public class RNNativeComponent extends ViewGroupManager<ViewGroup> {public static final String REACT_CLASS = "RNNativeComponent";
}
  • 覆蓋 getName 方法:
@Override
public String getName() {return REACT_CLASS;
}
  • 覆蓋 createViewInstance 方法,返回你的自定義原生組件
@Overrideprotected FrameLayout createViewInstance(final ThemedReactContext reactContext) {return //用 FrameLayout 包裹的自定義原生組件}
  • 創建原生 prop 方法
  @ReactProp(name = "prop_name")public void setPropName(NativeComponent nativeComponent, propDataType prop) {}
  • JavaScript 中使用
import { requireNativeComponent } from "react-native"const MyNativeComponent = requireNativeComponent("RNNativeComponent", RNNativeComponent, {nativeOnly: { }
})<MyNativeComponent prop={this.props.prop}>

iOS

Macro

  • RCTBridgeModule: RCTBridgeModule 是一個 protocol,它為注冊 bridge 模塊 RCTBridgeModule @protocol RCTBridgeModule 提供了一個接口
  • RCT_EXPORT_MODULE(js_name): 在 class implementation 時使用 bridge 注冊你的模塊。參數 js_name 是可選的,用作 JS 模塊的名稱,若不定義,將會默認使用 Objective-C 的 class 名
  • RCT_EXPORT_METHOD(method)RCT_REMAP_METHOD(, method): bridge 模塊亦可定義方法,這些方法可以作為 NativeModules.ModuleName.methodName 輸出到 JavaScript。
RCT_EXPORT_METHOD(funcName:(NSString *)onlyStringsecondName:(NSInteger)argInteger){ ... }

上面的例子暴露到 JavaScript 是 NativeModules.ModuleName.funcName

創建原生模塊包

我們需要在項目中添加兩個文件:頭文件和源文件。

- MyNativePackage.h#import "RCTBridgeModule.h"@interface MyNativePackage : NSObject <RCTBridgeModule>
@end- MyNativePackage.m#import "MyNativePackage.h"@implementation MyNativePackageRCT_EXPORT_MODULE();@end

創建模塊方法

RCT_EXPORT_METHOD(Show:(RCTResponseSenderBlock)callback) {
}
  • JavaScript 中引入模塊方法
import { NativeModules } from 'react-native'const MyNativeModule = NativeModules.MyNativeModule
MyNativeModule.Show(() => {})

創建原生 View 組件

  • 創建 view 方法,返回你的原聲組件
- (UIView *)view {//Initialize & return your native component view
}
  • 創建原生 prop 方法
RCT_CUSTOM_VIEW_PROPERTY(prop, DATA_TYPE_OF_PROP, YOUR_NATIVE_COMPONENT_CLASS) {
}
  • 在 JavaScript 中使用
import { requireNativeComponent } from "react-native"const MyNativeComponent = requireNativeComponent("RNNativeComponent", RNNativeComponent, {nativeOnly: { }
})<MyNativeComponent prop={this.props.prop}>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252258.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UVa 1354 天平難題 枚舉二叉樹

題意&#xff1a;給出房間寬度 r 和 s 個掛墜的重量 wi&#xff0c;設計一個盡量寬的天平&#xff0c;掛著所有掛墜。天平由一些長度為 1 的木棍組成&#xff0c;木棍的每一端要么掛一個掛墜&#xff0c;要么掛另外一個木棍。 這題卡了很久&#xff0c;看了很多大神的代碼&…

通過指針便利圖像元素

for (size_t y 0; y < image.rows; y) {//row_ptr為第y行的頭指針&#xff0c;unsigned char* row_ptr image.ptr<unsigned char>(y);for (size_t x 0; x < image.cols; x) {//data_ptr: 指向待訪問像素unsigned char* data_ptr &row_ptr[x*image.channels…

[精華][推薦]SSO CAS單點登錄框架學習 搭建詳細步驟及源碼

1.了解單點登錄 SSO 主要特點是: SSO 應用之間使用 Web 協議(如 HTTPS) &#xff0c;并且只有一個登錄入口. SSO 的體系中有下面三種角色: 1) User(多個) 2) Web 應用(多個) 3) SSO 認證中心(一個) 2.SSO 實現包含以下三個原則 1) 所有的登錄都在 SSO 認證中心進行。 2) SS…

電腦下載的M4A格式文件怎么轉換為MP3格式

M4A文件格式并不是一個家喻戶曉的名字&#xff0c;與&#xff2d;&#xff30;&#xff13;格式相比&#xff0c;知名度遠遠落后。但是&#xff0c;這并不意味著它無關緊要&#xff0c;有時候我們下載的音樂可能就是M4A格式的&#xff0c;如果換一個設備播放可能就會出現格式不…

python-for循環

一、功能 for 循環提供了python中最強大的循環結構&#xff08;for循環是一種迭代循環機制&#xff0c;而while循環是條件循環&#xff0c;迭代即重復相同的邏輯操作&#xff0c;每次操作都是基于上一次的結果&#xff0c;而進行的&#xff09; Python for循環可以遍歷任何序列…

六、利用frp穿透連接內網的linx系統和windows系統

服務端的配置 # frps.ini [common] bind_port 7000 說明&#xff1a;防火墻放行該端口 啟動&#xff1a;./frps -c ./frps.ini 后臺啟動&#xff1a;nohup ./frps -c ./frps.ini & 客戶端的配置 (1)windows系統 # frpc.ini [common] server_addr x.x.x.x server_port 70…

根據相機內參進行圖像去畸變

cv::Mat img; cv::Mat img_undistort; double fx,fy, cx, cy, k1, k2, p1, p2, k3;for(int v 0; v < img.rows; v){for(int u 0; u < img.cols; u){//根據內參數&#xff0c;計算歸一化坐標系下的坐標點double x (u-cx)/fx;double y (v-cy)/fy;double r2 x*x y*y;/…

initialize方法與load方法比較

load方法和initialize方法類似點 1. 都只會調用一次2. 父類在子類之前加載 復制代碼不同點在于&#xff1a; 1. 加載時間不同&#xff0c;load方法在main()函數前進行調用&#xff0c;initialize在第一次調用類的所屬方法時在調用<可能永遠不調用>。2. load方法不會被Cat…

KindEditor

1、進入官網 2、下載 官網下載&#xff1a;http://kindeditor.net/down.php 3、文件夾說明 ├── asp asp示例 ├── asp.net asp.net示例 ├── attached 空文件夾&#xff0c;放置關聯文件attached ├── …

service mysqld start,Failed to start mysqld.service: Access denied

service mysqld start 然后報&#xff1a; AUTHENTICATING FOR org.freedesktop.systemd1.manage-units Authentication is required to start mysqld.service.Authenticating as: lll,,, (lll)Password: polkit-agent-helper-1: pam_authenticate failed: Authentication fa…

使用realsense t265測試svo2.0視覺里程計

畢業三年了&#xff0c;現在是第二份工作&#xff0c;第一份工作已經結束一年半了&#xff0c;這意味著&#xff0c;我有一年半的時間沒有搞視覺SLAM相關的東西了&#xff0c;雖然在第二份工作也是做視覺相關的&#xff0c;但是只是用到一些目標識別和跟蹤的知識&#xff0c;并…

JSP動作標識

jsp中include有兩種形式: include指令&#xff1a;<% include file""%> include動作&#xff1a;<jsp:include page"" /> 他們的區別&#xff1a; <% include file""%>又稱靜態包含&#xff0c;使用時要注意以下幾點&#xf…

面試必問之JVM原理

1&#xff1a;什么是JVM JVM是Java Virtual Machine&#xff08;Java虛擬機&#xff09;的縮寫&#xff0c;JVM是一種用于計算設備的規范&#xff0c;它是一個虛構出來的計算機&#xff0c;是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令…

InfluxDB學習之InfluxDB的基本操作

InfluxDB提供類SQL語法&#xff0c;如果熟悉SQL的話會非常容易上手。本文就為大家介紹一下InfluxDB的基本操作。 InfluxDB提供類SQL語法&#xff0c;如果熟悉SQL的話會非常容易上手。 一、InfluxDB操作方式 InfluxDB提供三種操作方式&#xff1a; 1&#xff09;客戶端命令行方式…

運行svo 2.0的 vio時遇到opencv沖突的問題

當我運行如下指令時&#xff0c;遇到了如下問題 指令 cd svo_ws source ./devel/setup.bash roslaunch svo_ros euroc_vio_mono.launch rosbag play MH_01_easy.bag -s 50 運行時遇到的問題 OpenCV Error: Bad argument (Unknown interpolation method) in resize, file /b…

DOS Network一月項目月報

歡迎大家閱讀DOS Network第一期項目月報&#xff01;DOS為了跟大家更好的溝通和交流&#xff0c;將在每個月為大家跟進DOS Network項目進展月報。月報主要分為項目研發和社區及營銷兩個部分。 如果你是剛認識DOS Network預言機網絡的新朋友&#xff0c;歡迎查閱往期文章&#x…

lsof詳解

from:https://www.cnblogs.com/the-study-of-linux/p/5501593.html lsof (list open files)是一個列出當前系統打開文件的工具。在linux系統環境下&#xff0c;任何事物都可以以文件形式存在&#xff0c;通過文件不僅可以訪問常規的數據&#xff0c;還可以訪問網絡連接和硬件。…

Ubuntu18.04上下載安裝使用sogou輸入法

下載地址&#xff1a;搜狗輸入法Linux官網-首頁 安裝設置網址&#xff1a;搜狗輸入法Linux官網-安裝指導 這樣Ubuntu下工作就更加方便了。

正則

&#xff08;一&#xff09;字符類 [...]  方括號內的任意字符 [^...]   不在方括號內的任意字符 .    除換行符和其它Unicode行終止符之外的任意字符 \w   任何ASCII字符組成的單詞&#xff0c;等價于[a-zA-Z0-9] \W   任何非ASCII字符組成的單詞&#xff0c;等價…

使用Cloud Studio寫python

1、進入【騰訊云開發者平臺】 2、點擊【進入工作空間】 3、點擊【新建工作空間】 4、點擊【從模版創建】 選擇你需要的空間環境&#xff0c;就可以開始啦&#xff01;轉載于:https://juejin.im/post/5c75f79051882562962ef5d7