第五章 RN與Native—由原生頁面跳轉到Rn頁面;在Rn頁面調用Android Native組件和Native數據

? ? ? ?在本教程的開始,就曾經提到過純Rn和原生與RN混合開發的兩種概念。之前的兩個Demo如果不考慮難易程度的話,則為純Rn應用開發。但在實際生產中,畢竟Rn的組件還不是那么完善,所以,當我們需要比較炫酷的動畫效果或者在使用Rn組件時遇到詭異的坑而沒有進展的時候,我們可以使用Rn與原生協同開發來實現最終效果。

React Native設計為可以在其基礎上編寫真正的原生代碼,并且可以訪問平臺所有的能力。這是一個相對高級的特性,我們并不認為它應當在日常開發的過程中經常出現,但具備這樣的能力是很重要的。如果React Native還不支持某個你需要的原生特性,你應當可以自己實現該特性的封裝。(這就麻煩了)

下面,我們來介紹我們的Demo3,照例先給出效果圖(Android):

(這個是在Demo2的樣式基礎上改的,由于Demo2的樣式在Android上根本沒法看,所以我適當增加了輸入框的寬度,添加了marginBottom等…)

項目git地址:https://github.com/yujiesuperman/react-native-demo3-RnandNative

Demo3總共完成了兩點:

從原生開機動畫跳轉到Rn登陸頁面,從Rn主界面調用Native的Toast方法和獲取字符串數據。

(一)從Rn頁面調用Native的組件方法

? ? ? 假設我們希望可以從Javascript發起一個Toast消息(Android中的一種會在屏幕下方彈出、保持一段時間的消息通知):

? ? ? 使用AS導入Android文件夾下的gradle項目。

①第一步是先添加一個原生的類(CustomToastModule),讓他繼承ReactContextBaseJavaModule, ?在這個方法中,我們主要的目的有兩個,

? ? ? 1)重寫getName方法,比如這里return的是NativeToastAndroid

? ? ? 2)重寫一個show方法,里面有native實現的一些功能

最終的目的就是能在JavaScript中調用

NativeToastAndroid.show('這個彈窗來自Android ', NativeToastAndroid.SHORT );

來調起一個Toast通知。

備注:一個可選的方法getContants返回了需要導出給JavaScript使用的常量。它并不一定需要實現,但在定義一些可以被JavaScript同步訪問到的預定義的值時非常有用。這樣的話,JavaScript寫SHORT或者LONG這邊就能對應替換了

②再添加一個類(NativeToastAndroidReactPackage),繼承ReactPackage,

這個類要將方法暴露出去,在應用的Package類的createNativeModules方法中添加這個模塊,把我們的CustomToastModule加進去,讓rn調用。

③在MainApplication中

? ? ? ?這里是第三個需要修改的類,剛才定義完ToastAndroidReactPackage方法的時候,需要在這里最終注冊

添加到return列表里。

④從AS中切回Rn中,

這個方法不是必須的,為了讓你的功能從JavaScript端訪問起來更為方便,通常我們都會把原生模塊封裝成一個JavaScript模塊。

這不是必須的,但省下了每次頁面在使用之前,

都從NativeModules中獲取對應模塊( . NativeToastAndroid) ?的步驟。這個JS文件也可以用于添加一些其他JavaScript端實現的功能(也就是說不必單拉出一個文件來實現這個東西,作者是為了方便閱讀,才單建立的目錄)。

⑤調用的時候,從上面引入

備注:從Rn調用Android的Toast組件我們已經寫完了,那么有些同學可能要問了,那要從Native向Js傳遞數據該咋辦?其實非常簡單,而且又多種實現的方式,這里只列舉一種:

在剛才的show方法下面再弄一個dataToJs,寫法如上,然后在Rn的js中這樣添加:

就完成了效果圖中的Alert彈窗展示從Native端拿到的數據了,

至于其他的獲取方式請參考Rn中文網鏈接:

http://reactnative.cn/docs/0.42/native-modules-android.html#content

注意:Rn也并沒有封裝全部的UI組件,只是封裝了一部分,要想自己封裝,提供一個ImageView之類的UI組件,則需要

①創建一個ViewManager的子類。

②實現createViewInstance方法。

③導出視圖的屬性設置器:使用@ReactProp(或@ReactPropGroup)注解。

④把這個視圖管理類注冊到應用程序包的createViewManagers里。

⑤實現JavaScript模塊。

在這里就不詳細介紹了,請想深入了解的朋友去Rn中文網上閱讀相關內容:

http://reactnative.cn/docs/0.42/native-component-android.html#content

(二)加入原生開機動畫AwesomeSplash

下面說下如何從炫酷的開機動畫跳轉到我們的Rn頁面,其實非常簡單,在GitHub上可以參看到AwesomeSplash的使用方法,

附上git鏈接:https://github.com/ViksaaSkool/AwesomeSplash

注意,他有一行注釋,就是千萬不要復寫onCreate方法,所以,如果你和我一樣是新建了一個activity,就要刪掉你的onCreate方法。

而且還要從git-AwesomeSplash上面的Demo中把對應的缺失的文件補充進來,在下面的animationsFinished方法中創建跳轉意圖,跳轉到RN的Activity頁面。

最后從配置文件中,把我們的AnimActivity設置為啟動頁面即可。

備注:可能有些人要問了,你這是RN項目中集成Native頁面,那如果是原有的Native項目該怎么去集成Rn頁面呢?

其實我感覺原理是差不多的,類似于環境轉移,比照著Rn項目生成的Native殼子里面的配置,去給我們自己之前的Native項目添加Rn支持,最后還是Native頁面跳RnActivity或者RnFragment。

比如首先配置build.gradle,然后再還需添加react native的DevSettingActivity,寫類繼承ReactActivity,提供一個實現ReactApplication的全局Application文件等等…如果想了解具體步驟的話可以參看:http://lib.csdn.net/article/reactnative/50089


總結:

好了,Demo3也講完了,現在我們來看下如果要進行一個Rn的項目開發大概需要進行哪些準備設計工作?

①設計組件數量,設計應用頁面到底該由哪些組件構成,組件的子組件數量

? ?組件的劃分遵循單一責任原則。

②Redux的狀態數的設計,(結合Demo2)

③路由的設計,頁面的組合方式(結合Demo2)

④是不是需要使用Native代碼配合

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容