Android原生項目中嵌入ReactNative項目

要將React Native嵌入到現(xiàn)有的Android原生項目中,需要遵循以下步驟:

創(chuàng)建React Native模塊

首先,需要在React Native項目中創(chuàng)建一個模塊,該模塊將公開想要在Android原生應(yīng)用程序中使用的React Native組件和方法∪鳎可以使用以下命令在React Native項目中創(chuàng)建一個新模塊:

react-native init MyReactNativeModule --library

導(dǎo)出React Native模塊

在React Native模塊中,需要導(dǎo)出要在Android原生應(yīng)用程序中使用的組件和方法扒磁。例如庆揪,如果要導(dǎo)出一個名為MyReactNativeComponent的組件和一個名為myReactNativeMethod的方法,可以在模塊中編寫以下代碼:

import { NativeModules } from 'react-native';

const { MyReactNativeModule } = NativeModules;

export default MyReactNativeModule;

export const MyReactNativeComponent = requireNativeComponent('MyReactNativeComponent');

在上述代碼中妨托,我們首先導(dǎo)入了NativeModules對象缸榛,該對象包含了我們將在原生應(yīng)用程序中使用的所有組件和方法。然后兰伤,我們將MyReactNativeModule導(dǎo)出為默認模塊内颗,并將MyReactNativeComponent導(dǎo)出為需要使用requireNativeComponent方法導(dǎo)出的原生組件。

添加React Native到Android原生項目

接下來敦腔,需要將React Native添加到的Android原生項目中均澳。可以使用以下步驟完成此操作:

在的Android項目的build.gradle文件中添加以下代碼:


dependencies {

    // ... other dependencies ...

    implementation 'com.facebook.react:react-native:0.66.4'

}

請注意符衔,此處使用的是React Native 0.66.4版本找前,應(yīng)該使用當前使用的版本。

在的Android項目的settings.gradle文件中添加以下代碼:


include ':app', ':react-native-my-react-native-module'

project(':react-native-my-react-native-module').projectDir = new File(rootProject.projectDir, '../MyReactNativeModule/android')

此處的react-native-my-react-native-module應(yīng)該替換為在React Native項目中創(chuàng)建的模塊名稱判族。

在的Android項目的app/build.gradle文件中添加以下代碼:


android {

    // ... other settings ...

    defaultConfig {

        // ... other settings ...

        missingDimensionStrategy 'react-native-camera', 'general'

    }

    // ... other settings ...

}

dependencies {

    // ... other dependencies ...

    implementation project(':react-native-my-react-native-module')

}

請注意躺盛,這里的react-native-my-react-native-module應(yīng)該替換為在React Native項目中創(chuàng)建的模塊名稱。

在原生應(yīng)用程序中使用React Native模塊

現(xiàn)在形帮,可以在的Android原生應(yīng)用程序中使用React Native模塊槽惫。例如,如果要在Android應(yīng)用程序中呈現(xiàn)MyReactNativeComponent組件辩撑,可以在XML布局文件中添加以下代碼:


<com.example.myapp.MyReactNativeComponent

  android:layout_width="match_parent"

  android:layout_height="match_parent" />

還可以在Java代碼中使用myReactNativeMethod方法界斜。例如,如果要在點擊按鈕時調(diào)用myReactNativeMethod方法合冀,可以在的Java代碼中添加以下代碼:


import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.bridge.ReactContext;

import com.facebook.react.bridge.ReactContextBaseJavaModule;

import com.facebook.react.bridge.ReactMethod;

import com.facebook.react.uimanager.SimpleViewManager;

import com.facebook.react.uimanager.ThemedReactContext;

public class MyReactNativeModule extends ReactContextBaseJavaModule {

  public MyReactNativeModule(ReactApplicationContext reactContext) {

    super(reactContext);

  }

  @Override

  public String getName() {

    return "MyReactNativeModule";

  }

  @ReactMethod

  public void myReactNativeMethod() {

    // Your code here

  }

}

public class MyReactNativeComponentManager extends SimpleViewManager<MyReactNativeComponent> {

  public static final String REACT_CLASS = "MyReactNativeComponent";

  @Override

  public String getName() {

    return REACT_CLASS;

  }

  @Override

  public MyReactNativeComponent createViewInstance(ThemedReactContext context) {

    return new MyReactNativeComponent(context);

  }

}

在上述代碼中各薇,我們首先創(chuàng)建了一個名為MyReactNativeModule的Java類,該類擴展了ReactContextBaseJavaModule類君躺。在這個類中峭判,我們重寫了getName方法來返回我們在React Native模塊中導(dǎo)出的名稱,并且我們還使用@ReactMethod注釋來公開myReactNativeMethod方法晰洒。

接下來朝抖,我們創(chuàng)建了一個名為MyReactNativeComponentManager的Java類啥箭,該類擴展了SimpleViewManager類谍珊。在這個類中,我們重寫了getName方法來返回我們在React Native模塊中導(dǎo)出的名稱,并且我們還使用createViewInstance方法創(chuàng)建了一個新的MyReactNativeComponent實例砌滞。

在原生應(yīng)用程序中注冊React Native模塊

最后侮邀,在的Android原生應(yīng)用程序中注冊React Native模塊”慈螅可以使用以下代碼完成此操作:


import com.facebook.react.ReactInstanceManager;

import com.facebook.react.ReactRootView;

import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;

import com.facebook.react.shell.MainReactPackage;

import java.util.Arrays;

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {

  private ReactInstanceManager mReactInstanceManager;

  private ReactRootView mReactRootView;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mReactInstanceManager = ReactInstanceManager.builder()

        .setApplication(getApplication())

        .setBundleAssetName("index.android.bundle")

        .setJSMainModulePath("index")

        .addPackage(new MainReactPackage())

        .addPackage(new MyReactNativeModulePackage())

        .setUseDeveloperSupport(BuildConfig.DEBUG)

        .setInitialLifecycleState(LifecycleState.RESUMED)

        .build();

    mReactRootView = new ReactRootView(this);

    mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeModule", null);

    setContentView(mReactRootView);

  }

  @Override

  public void invokeDefaultOnBackPressed() {

    super.onBackPressed();

  }

}

在上述代碼中绊茧,我們首先創(chuàng)建了一個名為MyReactNativeModulePackage的Java類,該類擴展了ReactPackage類打掘。在這個類中华畏,我們重寫了createViewManagers方法來返回一個包含我們要在Android應(yīng)用程序中使用的所有React Native組件的列表。

然后尊蚁,在MainActivity類中亡笑,我們使用ReactInstanceManager創(chuàng)建了一個React Native實例管理器,并將其用作ReactRootView的參數(shù)横朋,以在Android應(yīng)用程序中呈現(xiàn)React Native模塊仑乌。在ReactInstanceManager的構(gòu)建器方法中,我們添加了我們之前創(chuàng)建的MyReactNativeModulePackage以注冊我們的React Native模塊琴锭。

最后晰甚,我們在MainActivity的onCreate方法中創(chuàng)建了一個新的ReactRootView,并使用它調(diào)用startReactApplication方法來啟動我們的React Native模塊决帖。

在React Native中使用原生組件

現(xiàn)在厕九,我們已經(jīng)在我們的Android應(yīng)用程序中嵌入了React Native模塊,并且我們可以使用它在原生代碼中公開的方法和組件古瓤。反過來止剖,我們還可以在React Native中使用原生組件。

要使用原生組件落君,請在的React Native代碼中使用以下代碼:


import React, { Component } from 'react';

import { requireNativeComponent } from 'react-native';

const MyNativeComponent = requireNativeComponent('MyReactNativeComponent');

export default class MyReactNativeApp extends Component {

  render() {

    return (

      <MyNativeComponent />

    );

  }

}

在上述代碼中穿香,我們首先使用requireNativeComponent函數(shù)導(dǎo)入我們之前創(chuàng)建的MyReactNativeComponent。然后绎速,我們在render方法中使用<MyNativeComponent>元素來呈現(xiàn)原生組件皮获。

請注意,我們在requireNativeComponent函數(shù)中傳遞的參數(shù)是我們在MyReactNativeComponentManager中使用的名稱纹冤,即“MyReactNativeComponent”洒宝。

總結(jié)

在本文中,我們討論了如何在Android原生應(yīng)用程序中嵌入React Native模塊萌京,并在React Native中使用原生組件雁歌。我們了解了如何設(shè)置React Native開發(fā)環(huán)境葬毫,如何創(chuàng)建一個新的React Native模塊掖肋,如何在Android應(yīng)用程序中注冊React Native模塊,并且如何使用原生組件唉工。

React Native提供了一種方便的方法,使開發(fā)人員可以在其現(xiàn)有的Android應(yīng)用程序中使用React Native模塊和組件乏盐,從而使其應(yīng)用程序更加動態(tài)和交互佳窑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市父能,隨后出現(xiàn)的幾起案子神凑,更是在濱河造成了極大的恐慌,老刑警劉巖何吝,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溉委,死亡現(xiàn)場離奇詭異,居然都是意外死亡爱榕,警方通過查閱死者的電腦和手機薛躬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呆细,“玉大人型宝,你說我怎么就攤上這事⌒跻” “怎么了趴酣?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坑夯。 經(jīng)常有香客問我岖寞,道長,這世上最難降的妖魔是什么柜蜈? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任仗谆,我火速辦了婚禮,結(jié)果婚禮上淑履,老公的妹妹穿的比我還像新娘隶垮。我一直安慰自己,他們只是感情好秘噪,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布狸吞。 她就那樣靜靜地躺著,像睡著了一般指煎。 火紅的嫁衣襯著肌膚如雪蹋偏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天至壤,我揣著相機與錄音威始,去河邊找鬼。 笑死像街,一個胖子當著我的面吹牛黎棠,可吹牛的內(nèi)容都是我干的京郑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼葫掉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟狱?” 一聲冷哼從身側(cè)響起俭厚,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驶臊,沒想到半個月后挪挤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡关翎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年扛门,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵寝。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡论寨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爽茴,到底是詐尸還是另有隱情葬凳,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布室奏,位于F島的核電站火焰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胧沫。R本人自食惡果不足惜昌简,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绒怨。 院中可真熱鬧纯赎,春花似錦、人聲如沸南蹂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碎紊。三九已至佑附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仗考,已是汗流浹背音同。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秃嗜,地道東北人权均。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓顿膨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叽赊。 傳聞我的和親對象是個殘疾皇子恋沃,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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