React Native,'不可用作本机方法参数'
Posted
技术标签:
【中文标题】React Native,\'不可用作本机方法参数\'【英文标题】:React Native, 'is not usable as a native method argument'React Native,'不可用作本机方法参数' 【发布时间】:2018-07-15 02:55:12 【问题描述】:我是 React Native 的新手。在开发本机模块时,我遇到了回调问题。 以下是来自 React Native 的错误消息
02-05 17:43:26.387 32301-32570/com.awesomeproject2 E/ReactNativeJNI: Got JS Exception: Exception calling object as function: abc,function f1()
_ToastExample2.default.show('1111', _ToastExample2.default.SHORT);
,72,73 is not usable as a native method argument (<unknown file>:1845)
02-05 17:43:26.387 32301-32570/com.awesomeproject2 E/ReactNativeJNI: Got JS Stack: invariant@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:1838:26
enqueueNativeCall@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:2259:20
fn@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:1999:40
onBtnPress@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:58362:32
proxiedMethod@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:34324:37
proxiedMethod@[native code]
touchableHandlePress@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:37170:47
touchableHandlePress@[native code]
_performSideEffectsForTransition@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:36821:36
_performSideEffectsForTransition@[native code]
_receiveSignal@http://localhost:8081/index.delta?platform=android&dev=true&minify=false:36754:46
_receiveSignal@[native code]
touchableHandleResponderRelease@http://localhost:8081/index.delta?platform=android&dev=true&
02-05 17:43:26.393 32301-32570/com.awesomeproject2 E/unknown:ReactNative: Exception in native call
java.lang.RuntimeException: Error calling RCTEventEmitter.receiveTouches
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
at android.os.Looper.loop(Looper.java:135)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:194)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.facebook.jni.CppException: Exception calling object as function: abc,function f1()
_ToastExample2.default.show('1111', _ToastExample2.default.SHORT);
,72,73 is not usable as a native method argument (<unknown file>:1845)
... 7 more
我的原生模块是这样的
@ReactMethod
public void testCallback(String message, Callback c1, Callback c2, Callback c3)
if (message.equals("123"))
c1.invoke(message);
else if (message.equals("abc"))
c2.invoke(message);
else
c3.invoke(message);
还有我的反应调用函数
onBtnPress()
function f1 ()
ToastExample.show('1111', ToastExample.SHORT);
;
function f2 ()
ToastExample.show('2222', ToastExample.SHORT);
;
function f3 ()
ToastExample.show('3333', ToastExample.SHORT);
;
ToastExample.testCallback('abc', f1, f2, f3);
我不知道为什么会发生此错误,有人可以帮助我吗?谢谢。
【问题讨论】:
【参考方案1】:我在使用带有 formData 字段的 Axios 时遇到了这个问题,而没有将附加的数据转换为字符串格式。
给出错误:
const formData = new FormData();
formData.append(<field_name>, field_data);
必须采用以下形式:
const formData = new FormData();
formData.append(<field_name>, JSON.stringify(field_data));
【讨论】:
【参考方案2】:当您将不适当的内容传递给属性时,就会出现这种错误。例如,我没有将确切的格式传递给 Image URI 属性,因为它会引发错误。这个错误在很大程度上说明了它本身。
没错。
<Image source = uri: 'https://reactnative.dev/img/tiny_logo.png'>
但是当你做这样的事情时。
<Image source = uri: '<NaN'>
这通常发生在您从 API 获取错误的数据格式时。
我的答案不适合这个特定的问题,但要找到 出确切的标题,我已经多次登陆这个链接,所以 节省别人的时间,我想在这里发布这个答案。
【讨论】:
【参考方案3】:我有 3 个回调的相同例外。如果你使用一两个回调,它工作正常
@ReactMethod public void testCallback(String message, Callback c1, Callback c2)
作品
【讨论】:
这不是解决问题的办法,而是一种避免问题的简单方法。 这很可能是解决问题的方法,因为回调是javascript和java之间最初步的通信方式。这可能是相同的限制。 为什么要从 3 个回调开始?你通常有一个成功和失败的回调,在本机模块中执行你的逻辑而不是返回一个成功或失败的回调。基于此,在 React Native 中处理它。我知道不回答问题,而只是一个可以解决问题或给你一个想法的提示。以上是关于React Native,'不可用作本机方法参数'的主要内容,如果未能解决你的问题,请参考以下文章
react native 网络get请求方式参数不可为undefined或null
React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)
在React Native中创建android本机模块时,“undefined不是函数”