起點(diǎn)RN Demo安卓遷移問(wèn)題匯總

1. 三方庫(kù)(調(diào)用原生)的使用

這里的三方庫(kù)特指需要調(diào)用原生的庫(kù)署隘,目前項(xiàng)目里用到了react-native-share(分享)、react-native-linear-gradient(漸變)亚隙、react-native-splash-screen(閃屏)磁餐、react-native-svg(svg)。
正常我們使用react-native link命令,原生依賴就成功地鏈接到你的iOS/Android項(xiàng)目了诊霹,但出于原生代碼可能被改寫(xiě)的情況羞延,需要在原生代碼中確認(rèn)一下引入情況:

2. lineHeight

在遷移過(guò)程發(fā)現(xiàn)幾個(gè)頁(yè)面都出現(xiàn)一下錯(cuò)誤提示:

Error while updating property 'lineHeight' in shadow node of type:RCTText

查文檔給出的解釋:

lineHeight must be an integer, numbers with decimals are not considered as valid values.

原來(lái)安卓上lineHeight必須是整數(shù),由于我們的項(xiàng)目中用了p2dp進(jìn)行適配脾还,會(huì)有把整數(shù)轉(zhuǎn)成了小數(shù)的情況伴箩,解決方法就是p2dp的結(jié)果進(jìn)行向上取整。

3. 字體引入

安卓上要使用自定義的字體鄙漏,必須要把字體文件放在[project root]/android/app/src/main/assets/fonts/目錄下才能生效嗤谚。

4. StatusBar

StatusBar是一個(gè)值得被重視的差異,它會(huì)影響到頭部導(dǎo)航的高度樣式問(wèn)題,甚至是整個(gè)頁(yè)面的高度問(wèn)題怔蚌。

4.1 StatusBar高度

  • 4.1.1 Android 手機(jī)狀態(tài)欄
    (1)當(dāng)狀態(tài)欄呈現(xiàn)在 Andorid 手機(jī)屏幕頂部時(shí)巩步,它會(huì)占用頂部這個(gè)空間,我們只能使用剩下的屏幕空間桦踊。也就是說(shuō)如果從第 0 行開(kāi)始放置組件時(shí)椅野,組件會(huì)緊貼著狀態(tài)欄的下邊沿顯示;
    (2)要想知道實(shí)際可用的屏幕高度,可以通過(guò)手機(jī)屏幕的高度減去狀態(tài)欄高度得到籍胯,安卓狀態(tài)欄的高度可通過(guò)StatusBar.currentHeight獲取竟闪。
  • 4.1.2 iOS 手機(jī)狀態(tài)欄
    (1)在 iOS 平臺(tái)上,取得的屏幕高度就是實(shí)際可使用的高度;
    (2)如果從第 0 行開(kāi)始排列組件時(shí)杖狼,組件會(huì)緊貼著手機(jī)屏幕的最上沿顯示瘫怜。如果狀態(tài)欄沒(méi)有被隱藏,它將覆蓋在第 0 行組件的上方;
    (3)如果不想設(shè)置狀態(tài)欄隱藏本刽,則應(yīng)當(dāng)空出狀態(tài)欄的顯示區(qū)域鲸湃。但可以為這個(gè)區(qū)域設(shè)置背景色,以使整個(gè)界面風(fēng)格統(tǒng)一子寓。

4.2 StatusBar樣式

Default status bar style (dark for iOS, light for Android)

在Android上默認(rèn)的樣式是白色暗挑,而IOS是黑色,所以當(dāng)我們?cè)诳缙脚_(tái)設(shè)置StatusBar樣式時(shí)斜友,避免使用defult炸裆,應(yīng)該直接使用light-contentdark-content

4.3 StatusBar背景色

Android上可通過(guò)backgroundColor設(shè)置背景色鲜屏,而IOS無(wú)此屬性烹看,需要通過(guò)手動(dòng)設(shè)置20dp高度的顏色作為背景色。另外項(xiàng)目中有個(gè)特殊需求洛史,需要StatusBar的顏色是漸變的惯殊,這時(shí)安卓上需要讓背景色透明,設(shè)置同等高度的漸變色來(lái)替代也殖。

5. 閃屏土思、廣告頁(yè)面

因?yàn)殚W屏涉及端代碼的編寫(xiě),自然需要重新開(kāi)發(fā)。
廣告頁(yè)面則有兩個(gè)思路:可以在端開(kāi)發(fā)己儒、也可以放在RN:

  • 在端的好處在于RN的首頁(yè)是"真首頁(yè)"崎岂,在啟動(dòng)應(yīng)用顯示閃屏的時(shí)候,為預(yù)加載首頁(yè)提供了時(shí)間闪湾,讓首頁(yè)出現(xiàn)的時(shí)間大大提升冲甘;缺點(diǎn)就是不夠靈活,如果將廣告圖換一個(gè)表現(xiàn)形式途样,需要重新發(fā)包损合。
  • 在RN的好處自然就是靈活,可以頻繁的變換廣告形式也無(wú)需更新App娘纷,另外如果是復(fù)雜的廣告形式嫁审,對(duì)于前端開(kāi)發(fā)人員,開(kāi)發(fā)端代碼的陳本要遠(yuǎn)高于開(kāi)發(fā)RN赖晶;缺點(diǎn)就是RN的首頁(yè)變成了廣告頁(yè)律适,而不是我們想要的首頁(yè),這樣啟動(dòng)圖無(wú)法爭(zhēng)取到首頁(yè)的訪問(wèn)的時(shí)間遏插,在首頁(yè)呈現(xiàn)的時(shí)間上肯定比上面的方法慢一些捂贿。

6. 輪播組件

這個(gè)問(wèn)題涉及到了第三方組件的兼容性。
之前在IOS上用的Carousel組件在Android會(huì)有一些異常的表現(xiàn)胳嘲。解決方案有兩種:

    1. 修改組件源碼厂僧,修復(fù)異常;
    1. 用一個(gè)兼容性沒(méi)問(wèn)題的同類組件替換

在解決過(guò)程中兩種辦法都嘗試過(guò)了牛,都可行颜屠。從這里也獲取一個(gè)經(jīng)驗(yàn),之后在選擇三方庫(kù)的時(shí)候鹰祸,盡量選擇更新時(shí)間近甫窟、star數(shù)量高、仍在維護(hù)蛙婴、大廠出品的粗井。

7. 監(jiān)聽(tīng)物理回退

由于安卓機(jī)子有一個(gè)物理回退鍵,如果在RN項(xiàng)目中不對(duì)其處理街图,則點(diǎn)擊物理回退鍵就會(huì)關(guān)閉App浇衬,而我們的預(yù)期是希望點(diǎn)擊后回退上一頁(yè)。

首頁(yè)我們要知道餐济,點(diǎn)擊物理回退耘擂,其實(shí)會(huì)調(diào)用端的onBackPressed方法,所以我們需要判斷如果是RN頁(yè)面颤介,應(yīng)該讓RN代碼自行決定處理方式梳星,當(dāng)然這層邏輯其實(shí)初始化項(xiàng)目就做好了:

    @Override
    public void onBackPressed() {
        //super.onBackPressed();

        if(mReactInstanceManager != null){
            mReactInstanceManager.onBackPressed();
        }else{
            super.onBackPressed();
        }
    }

這樣我們只需要在RN項(xiàng)目里監(jiān)聽(tīng)這個(gè)回退赞赖,然后處理自己想要的邏輯就行了滚朵,代碼大致如下:

    componentDidMount() {
        if (Platform.OS === 'android') {
            BackHandler.addEventListener('hardwareBackPress', this._handleBack.bind(this));
        }
    }

    componentWillUnmount() {
        if (Platform.OS === 'android') {
            BackHandler.removeEventListener('hardwareBackPress', this._handleBack.bind(this));
        }
    }

只需要在程序入口做一次監(jiān)聽(tīng)冤灾,后續(xù)頁(yè)面無(wú)需處理。

8. Modal

Android平臺(tái)Modal組件中的onRequestClose是一個(gè)必傳參數(shù)辕近,IOS則不需要韵吨。
可以在Modal的文檔上可以看到關(guān)于onRequestClose參數(shù)的描述:

On the Android platform, this is a required function.

至于為什么只有安卓平臺(tái)需要,我猜大概率和物理回退的相關(guān)處理有關(guān)系移宅。

9. 自定義字體的高度問(wèn)題

目前項(xiàng)目中引入了兩個(gè)外部字體:思源宋和閱文定制的數(shù)字字體归粉。
引入字體會(huì)有一定高度的上下pandding,樣式處理上也有別于常規(guī)字體漏峰,需要設(shè)置lineHeight糠悼、height更好的定位位置。

10. Text樣式之ellipsizeMode屬性

Text樣式中的ellipsizeMode屬性 , 用來(lái)配合numberOfLines 顯示不完全省略的位置, 可選值'head', 'middle','tail','clip'浅乔,而其中'clip'只能在IOS中使用倔喂,安卓平臺(tái)會(huì)報(bào)錯(cuò)。

11. popover組件

這個(gè)問(wèn)題同問(wèn)題6靖苇,一樣涉及到了第三方組件的兼容性席噩。
其中比較核心的問(wèn)題是安卓平臺(tái)上不支持shadow陰影屬性的設(shè)置,這個(gè)問(wèn)題在下一條會(huì)提到贤壁。
另外這個(gè)庫(kù)的開(kāi)發(fā)時(shí)間比較早且已經(jīng)無(wú)人維護(hù)悼枢,所以類似這樣的庫(kù)以后應(yīng)該規(guī)避。
至于最終的解決方案脾拆,其實(shí)是加了一層蒙層來(lái)替代陰影的效果馒索。

12. 陰影屬性

在IOS上可以通過(guò)如下設(shè)置陰影:

    shadowOffset: {width: 0, height: 0},
    shadowColor: 'black',
    shadowOpacity: 1,
    shadowRadius: 5

而Android上并不支持shadow相關(guān)的屬性,只提供了一個(gè)elevation屬性名船,使用方法如下:

    backgroundColor: 'black',
    elevation: 20,

elevation顧名思義就是 “仰角”双揪,通過(guò)為視圖增加 “仰角” 方式來(lái)提供陰影,仰角越大包帚,陰影越大渔期。
elevation的設(shè)置比較局限,設(shè)置無(wú)法設(shè)置offset渴邦。如果需要更好的效果疯趟,還是需要通過(guò)其它方式去實(shí)現(xiàn),svg谋梭、漸變等信峻,當(dāng)然也有這樣庫(kù)提供了解決方案,像react-native-shadow瓮床、react-native-cardview都是值得參考的盹舞。

13. 觸摸點(diǎn)擊

目前關(guān)于觸摸點(diǎn)擊有以下幾種方式:

  • TouchableHighlight

? What it does: Darkens or lightens the background of the element when pressed.
? When to use it: On iOS for touchable elements or buttons that have a solid shape or background, and on ListView items.

  • TouchableOpacity

? What it does: Lightens the opacity of the entire element when pressed.
? When to use it: On iOS for touchable elements that are standalone text or icons with no backgroundcolor.

  • TouchableNativeFeedback

? What it does: Adds a ripple effect to the background when pressed.
? When to use it: On Android for almost all touchable elements.

安卓平臺(tái)推薦用TouchableNativeFeedback

14. TextInput

TextInput在安卓平臺(tái)默認(rèn)有下劃線且框內(nèi)文字樣式也有問(wèn)題产镐,需要做如下兼容處理:

    underlineColorAndroid = "transparent"  //android需要設(shè)置下劃線為透明才能去掉下劃線
    style={{padding:0}}// 矯正樣式

15. ScrollView

我們觀察Android和IOS默認(rèn)的下拉刷新表現(xiàn)形式是不一樣的,這是因?yàn)榘沧可系?code>ScrollView沒(méi)有IOS的彈性bounces踢步,這也使得我們通過(guò)onScroll癣亚、onScrollEndDrag獲取X軸、Y軸距離做的一些判斷會(huì)有所區(qū)別获印。

16. react-native-scrollable-tab-view組件卡頓

這個(gè)組件在切換兩個(gè)數(shù)據(jù)量稍大的Tab時(shí)述雾,就會(huì)有明顯的卡頓,開(kāi)始以為是性能問(wèn)題導(dǎo)致動(dòng)畫(huà)卡頓兼丰,后來(lái)debug發(fā)現(xiàn)是組件在切換回已經(jīng)render的view玻孟,還做了一次render,導(dǎo)致阻塞了動(dòng)畫(huà)的執(zhí)行鳍征,解決辦法是通過(guò)shouldComponentUpdate判斷是否有必要render黍翎,當(dāng)然也可以使用PureComponent來(lái)實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艳丛,一起剝皮案震驚了整個(gè)濱河市匣掸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌质礼,老刑警劉巖旺聚,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眶蕉,居然都是意外死亡砰粹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)造挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碱璃,“玉大人,你說(shuō)我怎么就攤上這事饭入∏镀鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵谐丢,是天一觀的道長(zhǎng)爽航。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乾忱,這世上最難降的妖魔是什么讥珍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窄瘟,結(jié)果婚禮上衷佃,老公的妹妹穿的比我還像新娘。我一直安慰自己蹄葱,他們只是感情好氏义,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布锄列。 她就那樣靜靜地躺著,像睡著了一般惯悠。 火紅的嫁衣襯著肌膚如雪邻邮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天吮螺,我揣著相機(jī)與錄音饶囚,去河邊找鬼帕翻。 笑死鸠补,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘀掸。 我是一名探鬼主播紫岩,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼睬塌!你這毒婦竟也來(lái)了泉蝌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揩晴,失蹤者是張志新(化名)和其女友劉穎勋陪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硫兰,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诅愚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劫映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违孝。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泳赋,靈堂內(nèi)的尸體忽然破棺而出雌桑,到底是詐尸還是另有隱情,我是刑警寧澤祖今,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布校坑,位于F島的核電站,受9級(jí)特大地震影響千诬,放射性物質(zhì)發(fā)生泄漏耍目。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一大渤、第九天 我趴在偏房一處隱蔽的房頂上張望制妄。 院中可真熱鬧,春花似錦泵三、人聲如沸耕捞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俺抽。三九已至敞映,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磷斧,已是汗流浹背振愿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛饭,地道東北人冕末。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侣颂,于是被迫代替她去往敵國(guó)和親档桃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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