記一次RN Android端在Mobx環(huán)境下使用FlatList導(dǎo)致列表錯(cuò)亂的問(wèn)題

排查結(jié)果

首先說(shuō)下結(jié)果睦刃,以供參考
github的issue有FlatList不顯示的問(wèn)題,表現(xiàn)的跟我不太一樣十酣,他們解決方案是將removeClippedSubviews={false}涩拙,我嘗試了一下不適用我的場(chǎng)景
最終找出罪魁禍?zhǔn)资莔obx的observable變量與FlatList的data在release環(huán)境下,未關(guān)閉RN log日志所導(dǎo)致的沖突

  • 解決方案1:release環(huán)境關(guān)掉日志(我是用babel的transform-remove-console插件來(lái)關(guān)閉的)
  • 解決方案2:如果一定要開(kāi)日志耸采,F(xiàn)latList的data不要給observable Array兴泥,給普通Array

問(wèn)題描述

首先問(wèn)題如下:
我的RN版本0.54.0,mobx3.4.1虾宇,mobx-react4.3.5

列表錯(cuò)亂現(xiàn)象

一個(gè)長(zhǎng)度為兩百多的數(shù)組只顯示了二十三條郁轻,后面全是空白,繼續(xù)往下劃是一個(gè)無(wú)限空白的list文留,還伴隨著閃屏現(xiàn)象好唯,太可怕,更可怕的是debug包無(wú)此問(wèn)題燥翅,release包卻有骑篙,最怕排查這種問(wèn)題,耗時(shí)耗力

解決思路

當(dāng)時(shí)第一反應(yīng)是沒(méi)做分頁(yè)一次性加載太多數(shù)據(jù)導(dǎo)致的森书,因?yàn)闆](méi)有想到這個(gè)接口會(huì)有這么多數(shù)據(jù)靶端,一般也就十幾二十條,隨即進(jìn)行了分頁(yè)處理凛膏,然而并沒(méi)有什么卵用杨名,仍然是二十三條后就顯示空白,再往后滑動(dòng)閃屏猖毫,此時(shí)也沒(méi)有其他頭緒台谍,這下子只能啃源碼來(lái)看什么原因了,不過(guò)好在FlatList是純js實(shí)現(xiàn)的吁断,不需要再去啃Java代碼了趁蕊。
首先找到FlatList.js文件,看它的render函數(shù)

render函數(shù)

通過(guò)配置legacyImplementation來(lái)選擇使用MetroListView或者VirtualizedList前者是老的ListView仔役,后者就是替代老ListView的新列表組件掷伙,官方解釋這個(gè)變量是用來(lái)比較性能的,一般用不著又兵,著重看看VirtualizedList任柜,view出了問(wèn)題首先就看看renderItem方法
VirtualizedList的renderItem方法

這里就只是區(qū)分了多欄與單欄列表,我的使用場(chǎng)景是單欄列表,這行代碼就只是給FlatList使用者回傳了一個(gè)info參數(shù)宙地,再看看info參數(shù)具體升熊,找到VirtualizedList的代碼,再找renderItem這個(gè)props在哪里調(diào)用的绸栅,
CellRenderer的render方法里renderItem回傳參數(shù)

可以看到是在CellRenderer這個(gè)組件的render方法里調(diào)用的级野,傳入了item,index粹胯,separators蓖柔,我們要找的就是item,但是item是從props中拿到的风纠,再找找CellRenderer在哪里使用况鸣,可以看到是在_pushCells方法中使用,_pushCells方法在VirtualizedList的render方法中調(diào)用竹观,
VirtualizedList的render方法

cells作為React.cloneElement(element,[props],[...children])的第三參數(shù)镐捧,如上圖代碼,此時(shí)基本可以確定問(wèn)題應(yīng)該在這個(gè)cells參數(shù)上了臭增,再回頭看看_pushCells方法
VirtualizedList的_pushCells方法

可以看到item數(shù)據(jù)是來(lái)自props的getItem方法懂酱,這個(gè)方法傳入了一個(gè)data和一個(gè)ii下標(biāo),顧名思義應(yīng)該就是在取單個(gè)列表的渲染數(shù)據(jù)誊抛,這個(gè)data就是FlatList的data列牺,我們的列表數(shù)據(jù)源,再回到調(diào)用方FlatList找到getItem方法
FlatList的getItem方法

這個(gè)方法只是對(duì)多欄和單欄列表取數(shù)據(jù)的邏輯做了區(qū)分拗窃,我們可以試著把取出來(lái)的數(shù)據(jù)打印出來(lái)看是否有異常瞎领,加好調(diào)試代碼,再編譯一個(gè)帶log的release包
item數(shù)據(jù)

可以看到第23個(gè)都挺正常随夸,到了24個(gè)就不正常了九默,到了28個(gè)直接拋出error了,加了調(diào)試日志之后還會(huì)crash了宾毒,所以這個(gè)數(shù)據(jù)源可能有問(wèn)題驼修,聯(lián)想到我用的Mobx框架,傳給data的是一個(gè)Observable Array伍俘,而非普通Array邪锌,猜測(cè)是Observable Array與FlatList在此環(huán)境下有沖突,隨后將其替換成普通Array癌瘾,然后打包,測(cè)試一切正常

結(jié)尾

當(dāng)時(shí)得出結(jié)論是FlatList和Observable Array搭配使用就會(huì)在release環(huán)境出問(wèn)題饵溅,但是如果是這種結(jié)果妨退,那問(wèn)題影響面就太大了,然后發(fā)現(xiàn)我打的release包為了方便定位bug,將transform-remove-console這個(gè)插件屏蔽了咬荷,打開(kāi)了js日志冠句。隨后我又試著關(guān)閉日志,F(xiàn)latList繼續(xù)使用Observable Array幸乒,然后打包懦底,測(cè)試一切正常,然后就經(jīng)過(guò)了幾番測(cè)試罕扎,基本確認(rèn)了問(wèn)題所在聚唐,實(shí)在有點(diǎn)玄學(xué),為了定位這一個(gè)bug腔召,打了快一天的包杆查。。當(dāng)然結(jié)論不重要臀蛛,重要的是解決問(wèn)題過(guò)程亲桦,以后再遇到這種問(wèn)題,解決起來(lái)應(yīng)該更加得心應(yīng)手

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浊仆,一起剝皮案震驚了整個(gè)濱河市客峭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抡柿,老刑警劉巖桃笙,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沙绝,居然都是意外死亡搏明,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)闪檬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)星著,“玉大人,你說(shuō)我怎么就攤上這事粗悯⌒檠” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵样傍,是天一觀的道長(zhǎng)横缔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)衫哥,這世上最難降的妖魔是什么茎刚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮撤逢,結(jié)果婚禮上膛锭,老公的妹妹穿的比我還像新娘粮坞。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贱傀,像睡著了一般滴铅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼关顷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柴我,可吹牛的內(nèi)容都是我干的解寝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼艘儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼聋伦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起界睁,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤觉增,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后翻斟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逾礁,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年访惜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘹履。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡债热,死狀恐怖砾嫉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窒篱,我是刑警寧澤焕刮,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站墙杯,受9級(jí)特大地震影響配并,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜高镐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一溉旋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避消,春花似錦低滩、人聲如沸召夹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纱意,卻和暖如春婶溯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷霉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工迄委, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人类少。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓叙身,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親硫狞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子信轿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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