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不是函数”

屏幕之间的本机导航

[技术博客]react native事件监听与原生通信——实现对通知消息的响应

使用 react-native 克隆本机 android 警报屏幕