1. 程式人生 > >React Native Android錯誤總結

React Native Android錯誤總結

錯誤一

提示:Exception in native call from JS
java.lang.RuntimeException: ReferenceError: Can’t find variable: __fbBatchedBridge
這類錯誤是剛剛接觸RN時容易犯的錯誤,請檢查你的手機或者模擬器是否和你的RN服務端在同一個區域網內。
或者如果你的js檔案除錯沒問題,你可以將JS打包,命令:

react-native bundle --entry-file index.android.js --bundle-output ./android/app/src/main/assets/index
.android.bundle --platform android --assets-dest ./android/app/src/main/res/ --dev false

index.android.js是我要打包的js,最終生成名稱是index.android.bundle,這是我需要的打包後的檔案。然後將最終生成的index.android.bundle放入到你的工程檔案下面的assets目錄下,沒有則建立一個。

錯誤二

提示:Exception in native call from JS
com.facebook.react.bridge.NativeArgumentsParseException: InteractionManager.pushToArticleDetail got 2 arguments, expected 1
這種類似
com.facebook.react.bridge.NativeArgumentsParseException: *.* got * arguments, expected *


這種問題的往往是在Android和JS通訊是產生的錯誤,檢查一下你的介面中的引數,例子提示的是InteractionManager.pushToArticleDetail的引數,JS中有兩個,而Android中引數只有一個,所以檢查引數,比對上即可。

錯誤三

提示:com.facebook.react.bridge.NativeArgumentsParseException: TypeError: expected dynamic type string', but had typeobject’ (constructing arguments for InteractionManager.pushToArticleDetail at argument index 0)
類似這種提示,往往是介面中引數型別的不匹配,需要注意的是RN介面中引數和Java引數的對應:

Boolean -> Bool
Integer -> Number
Double -> Number
Float -> Number
String -> String
Callback -> function
ReadableMap -> Object
ReadableArray -> Array

將所需的引數型別改成提示型別即可。

錯誤四

提示: Cannot convert argument of type class java.util.HashMap
at com.facebook.react.bridge.Arguments.fromJavaArgs(Arguments.java:57)
at com.facebook.react.bridge.CallbackImpl.invoke(CallbackImpl.java:29)
at com.zhihui.zbl.modules.InteractionManager.pushToArticleDetail(InteractionManager.java:45)

這種是在Callback中回撥的引數有問題,需要了解下Callback和Promise。

Callback和Promise

以下內容原文地址
在react-native中可以通過在java層自定義ReactMethod(https://segmentfault.com/a/1190000004486024)方式給JavaScript呼叫,這樣在JavaScript層就可以直接呼叫Android中的Native方法.
但在大部分的方法呼叫中,都需要知道呼叫方法之後的處理結果是什麼,有沒有出現異常等情況。JavaScript本身是事件驅動的語言,需在JavaScript中可以使用回撥方法來處理函式返回的結果。同樣地在react-native中定義了Callback和Promise的介面,用來處理JavaScript呼叫Java方法的回撥。

Callback

Callback是react.bridge中的一個介面,它作為ReactMethod的一個傳參,用來對映JavaScript的回撥函式(function)。Callback介面只定義了一個方法invoke,invoke接受多個引數,這個引數必須是react.bridge中支援的引數。

Promise

Promise是ES6中增加的對於非同步程式設計和回撥更加友好的API(https://segmentfault.com/a/1190000004505028),使用Promise可以更簡潔,更靈活地處理回撥。
在react.briage中定義的Promise介面,實現了resolve和reject的方法,resolve用來處理正確處理結果的情況,reject用來處理異常的情況。
使用Promise比使用Callback更加的簡潔,還能更加靈活的在多執行緒之間進行切換。