ReactNative插件開發(fā)

ReactNative插件開發(fā)

安裝

$ npm install -g yarn react-native-cli
$ npm install -g react-native-create-library

創(chuàng)建HelloWorld

$ react-native init AwesomeProject

編譯并運(yùn)行 React Native 應(yīng)用

$ cd AwesomeProject
$ react-native run-android

步驟

1. 創(chuàng)建插件項(xiàng)目

選擇一個(gè)額外的目錄拂檩,開始創(chuàng)建插件疙咸。

react-native-create-library --package-identifier com.reactlibrary --platforms android,ios MyLibrary

2. 編寫插件Module

進(jìn)入創(chuàng)建好的插件目錄铜涉,找到xxxModule.java的文件臼隔,該Module它可以實(shí)現(xiàn)一些JavaScript所需的功能沉填。

package com.reactlibrary;

import android.widget.Toast;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Nullable;

public class RNMyLibraryModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;
  private static final String DURATION_SHORT_KEY = "SHORT";
  private static final String DURATION_LONG_KEY = "LONG";

  public RNMyLibraryModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

  @Override
  public String getName() {
    return "RNMyLibrary";
  }

  @Nullable
  @Override
  public Map<String, Object> getConstants() {
    Map<String, Object> constants = new HashMap<>();
    constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
    constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
    return constants;
  }

  @ReactMethod
  public void show(String message, int duration) {
    Toast.makeText(getReactApplicationContext(), message, duration).show();
  }
}

getName()這個(gè)函數(shù)用于返回一個(gè)字符串名字,這個(gè)名字在 JavaScript 端標(biāo)記這個(gè)模塊霞扬。
getConstants()返回了需要導(dǎo)出給 JavaScript 使用的常量糕韧,它并不一定需要實(shí)現(xiàn)。
注解@ReactMethod喻圃,用于提供給JavaScript調(diào)用的方法萤彩,方法的返回類型必須為void。React Native 的跨語(yǔ)言訪問(wèn)是異步進(jìn)行的斧拍,所以想要給 JavaScript 返回一個(gè)值的唯一辦法是使用回調(diào)函數(shù)或者發(fā)送事件雀扶。

3. 編寫插件Package

注冊(cè)這個(gè)模塊。我們需要在應(yīng)用的 Package 類的createNativeModules方法中添加這個(gè)模塊肆汹。

package com.reactlibrary;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;

public class RNMyLibraryPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
      return Arrays.<NativeModule>asList(new RNMyLibraryModule(reactContext));
    }

    // Deprecated from RN 0.47
    public List<Class<? extends JavaScriptModule>> createJSModules() {
      return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
      return Collections.emptyList();
    }
}

4. 編寫index.js愚墓,用于返回native模塊

import { NativeModules } from 'react-native';

const { RNMyLibrary } = NativeModules;

export default RNMyLibrary;

其中,RNMyLibrary這個(gè)名字需要與Module中g(shù)etName()返回的字符串相同县踢。

5. 引入插件

方法一:

打開插件目錄下package.json转绷,記錄name的值伟件。在這里示例為"name": "react-native-my-library"硼啤。接下來(lái)會(huì)link它。

使用命令行終端cd到插件根目錄斧账,執(zhí)行

$ yarn link

cd到項(xiàng)目根目錄谴返,執(zhí)行

$ yarn link "react-native-my-library"

使鏈接生效。它可以讓react native工程中的android和ios原生項(xiàng)目咧织,自動(dòng)去生成依賴(會(huì)在原生項(xiàng)目中生成配置代碼)嗓袱。在項(xiàng)目根目錄執(zhí)行

$ react-native link "react-native-my-library"

方法二:

打開項(xiàng)目目錄中的package.json,修改dependencies

"dependencies": {
    "react": "16.6.0-alpha.8af6728",
    "react-native": "0.57.4",
    "react-native-my-library": "file:../MyLibrary"
}

react-native-my-library為插件的name习绢,file后面帶的是插件目錄相對(duì)當(dāng)前項(xiàng)目的路徑渠抹。然后cd到項(xiàng)目根目錄,執(zhí)行

$ yarn

$ react-native link "react-native-my-library"

6. 運(yùn)行

$ react-native run-android

7. 更新Library

每次更新插件代碼闪萄,都需要將項(xiàng)目的鏈接清除梧却,然后再重新鏈接。最好是清除緩存败去。為了避免說(shuō)你更新的原生代碼沒(méi)有生效的情況放航。

方法一:

進(jìn)入項(xiàng)目根目錄

$ react-native unlink "react-native-my-library"
$ yarn unlink "react-native-my-library"

進(jìn)入到插件目錄

$ yarn unlink

修改好插件代碼后,然后進(jìn)入插件根目錄圆裕,刪除node_modules

$ rm -rf node_modules

需要重新鏈接广鳍。

$ yarn

同上【引入插件 一】的說(shuō)明依次執(zhí)行荆几。

方法二:

進(jìn)入項(xiàng)目根目錄

$ react-native unlink "react-native-my-library"

修改好插件代碼后,然后進(jìn)入插件根目錄赊时,刪除node_modules

$ rm -rf node_modules

需要重新鏈接吨铸。

$ yarn

同上【引入插件 二】的說(shuō)明依次執(zhí)行。

配置中出現(xiàn)的問(wèn)題:

1. 找不到包引用

將VSCode和模擬器/命令行終端全部關(guān)掉祖秒,監(jiān)聽(tīng)端口8081的進(jìn)程全部關(guān)閉焊傅。然后重新打開,重新運(yùn)行狈涮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狐胎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歌馍,更是在濱河造成了極大的恐慌握巢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件松却,死亡現(xiàn)場(chǎng)離奇詭異暴浦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晓锻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門歌焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砚哆,你說(shuō)我怎么就攤上這事独撇。” “怎么了躁锁?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纷铣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我战转,道長(zhǎng)搜立,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任槐秧,我火速辦了婚禮啄踊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刁标。我一直安慰自己颠通,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布命雀。 她就那樣靜靜地躺著蒜哀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撵儿,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天乘客,我揣著相機(jī)與錄音,去河邊找鬼淀歇。 笑死易核,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浪默。 我是一名探鬼主播牡直,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纳决!你這毒婦竟也來(lái)了碰逸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阔加,失蹤者是張志新(化名)和其女友劉穎饵史,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜榔,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胳喷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夭织。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吭露。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尊惰,靈堂內(nèi)的尸體忽然破棺而出讲竿,到底是詐尸還是另有隱情,我是刑警寧澤择浊,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布戴卜,位于F島的核電站,受9級(jí)特大地震影響琢岩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜师脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一担孔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吃警,春花似錦糕篇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至安券,卻和暖如春墩崩,著一層夾襖步出監(jiān)牢的瞬間氓英,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工鹦筹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铝阐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓铐拐,卻偏偏與公主長(zhǎng)得像徘键,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遍蟋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容