那些年我們踩過的坑之——RN掃碼

3c6d55fbb2fb43163a6a970228a4462309f7d355.jpg

簡單說一下事情的起因,隨著條形碼被發明之后,很快人們就發現,光條形碼已經不夠用了,于是,二維碼也隨之到來。隨著二維碼的普及,人們發現其有諸多優點,更方便,更安全。尤其杭州這種支付寶全民普及的城市,很多人早餐兩塊錢的包子都習慣支付寶,因為你賣家也很方便,注冊個支付寶,二維碼打印出來,隨便找個地方一貼,別人只需掃碼支付就行。媽媽再也不用擔心本來就忙的焦頭爛額還要找零問題了。

所以,我們這種有互聯網思維的人自然不能落于人后,本著人無我有,人有我優的原則,一個都不能少。完整代碼:https://github.com/hong007/ReactNativeNote
然后我就開始了我RN踩坑之旅的新篇章——二維碼掃碼功能。具體需求是,一個輸入框,可以輸入也可以掃碼(類似添加銀行卡卡號)。

感謝全球同性交友網站,RN自帶的調用攝像頭模塊有react-native-camerareact-native-barcodescanner但是有一個小問題,
react-native-camera官方說是針對ios,早期只具有調用攝像頭功能,如拍照,攝像等,后來完善可以掃碼了,而且android也可以用,但掃碼還是不行(可能是我環境沒搭好);
react-native-barcodescanner只針對android端,條形碼和二維碼都可以。
后來有人把二者合并,搞了個react-native-barcode-scanner-universal,其實就是判斷了一下應用平臺,有興趣的朋友可以試試。

我一開始采用react-native-camera,結果發現Android只能拍照,有人會問,你丫都知道react-native-camera只 適配ios,你還去適配Android,不是自己找罪受嗎?這還是理解文檔不到位,因為我看了這兩個模塊的作者說的,按我的翻譯是,0.4版本以后已經支持Android(https://github.com/ideacreation),然后我就一頭扎進去了,折騰半天,果然不行。這件事告訴我們——多學門外語是多么重要,而且不要抱有僥幸心理。

然后,我還是老老實實的用react-native-barcodescanner,配置和簡單,按官方說明即可,然后也可以用了。
我以為這樣就結束了,沒想到,這才剛剛開始。。。
首先,掃碼返回上一個頁面之后,頁面底部會有30%左右的黑色區域覆蓋,這什么貴鬼,,,好吧,你看不到(" talk is cheap , show me the code")上圖先,如下圖a:

圖a

圖b

google了一下(好吧,是度娘),原來是需要給控件加一個背景屬性backgroundColor:'rgba(0,0,0,.1)',試了一下,果然管用,效果如下上圖b。但是具體原因還沒有找到,有人說是攝像頭沒有釋放導致的。

上面說的,只是掃碼成功了,但是值怎么傳回去呢!首先用的state屬性,然后不頂用;又試了本地存儲AsyncStorage,即在掃碼成功之后,將值存在本地,然后將路由push至上一個頁面,上一個頁面也取到值了,,,然后我又試了一下再掃一次,打開之后,如下圖圖c:

wtf!!!怎么就變"黑"了呢???說好的白頭偕老呢?然后,又是一番折騰,原來是只push至新場景,掃碼頁面還是在的,但是不知為什么再次進來之后就黑了,必須重新啟動APP才行,也就是第一次掃碼有效,再次掃碼就出錯,跳轉之前應該將掃碼頁面pop掉,果然,pop就可以,不會再"黑"了。

圖c

凡事都怕但是,所以,但是,第一次掃碼成功之后,將值存在本地,然后第一個頁面可以取到,但是第二次掃碼,再將掃碼頁面pop掉,第一個頁面沒有更新,想了半天肯定是第一個頁面沒有刷新,然后想了想,在切換場景時通過param傳遞參數,大家都說可以,可能也的確是可以,只是我一直沒搞出來,,,真的是想死的心都有啊!無奈,人不能讓尿憋死,方法總是有的嘛!所以,又想了其他辦法,發現還是有的。

RN有一個叫做DeviceEventEmitter,
發送數據:

DeviceEventEmitter.emit('自定義名稱',發送數據);```

接受數據:
```DeviceEventEmitter.addListener('名稱',(events) ={使用數據events});```

在頁面跳轉時可以監聽事件,使用也很簡單,首先引入模塊,
然后在A頁面監聽:

DeviceEventEmitter.addListener("changeBarCode",(events)=>{_this.setState({scannText:events})}),

再在B頁面添加事件:
```DeviceEventEmitter.emit("changeBarCode",e.data);```
這樣整個功能也都實現了,雖然走了很多彎路,但還是走向正途了。

**備注:**安卓二維碼掃碼之后第二次進入或者手機鎖屏或黑屏之后,再次打開二維碼掃碼出現黑屏情況。
[https://github.com/ideacreation/react-native-barcodescanner/pull/61](https://github.com/ideacreation/react-native-barcodescanner/pull/61)
對比修改CameraManager.java 和CameraPreview.java文件。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容