尝试调用本机模块中的方法时出现以下错误:
'undefined' is not an object (evaluating 'ScaleController. updateScaleFromJSON')
我的原生模块Objective-C文件 -
RCTScaleController.h:
#ifndef RCTScaleController_h
#define RCTScaleController_h
#import "RCTBridgeModule.h"
@interface RCTScaleController : NSObject <RCTBridgeModule>
@end
#endif /* RCTScaleController_h */
RCTScaleController.mm:
#import "RCTScaleController.h"
#import "ScaleControllerObjC.h"
#import "RCTLog.h"
@implementation RCTScaleController
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(updateScaleFromJSON:(NSString *)jsonString)
{
RCTLogInfo(@"About to send json: %@", jsonString);
ScaleControllerObjC *scaleController = [[ScaleControllerObjC alloc] init];
[scaleController updateScaleFromJSON:jsonString];
}
在我的JS文件中需要它:
var ScaleController = require('react-native').NativeModules.RCTScaleController;
这里正在调用它导致错误:
ScaleController.updateScaleFromJSON (JSON.stringify (scale));
我已经看过我见过的例子,不知道这里有什么问题。
答案 0 :(得分:15)
通常,如果模块以RCT
作为前缀,则在NativeModules中它只是后面的子字符串,因此您不必重命名整个模块,只需以NativeModules
的方式调用它。
示例:的
所以,例如在Android的情况下,如果您的getName()
函数确实返回了类似“RCTMyName”的名称:
@Override
public String getName() {
return "RCTMyName";
}
然后返回Javascript,您必须将其称为,不用 RCT
,即只需MyName
:
import { NativeModules } from 'react-native';
export default NativeModules.MyName;
答案 1 :(得分:1)
奇怪的是,通过将模块从RCTScaleController
重命名为ReactScaleController
来解决此问题。
任何人都知道为什么? RCT是内部React模块的前缀吗?
答案 2 :(得分:1)
我在很长一段时间内遇到了这个问题,将React Native添加到现有的Android应用程序中。我的问题是,集成React Native,创建本机模块的guide没有提到在这种情况下需要在ReactInstanceManager实例中声明包,而不是在主Application文件中。对于Android,实例声明看起来像是这样(可能类似于iOS):
ReactInstanceManager.builder()
.setApplication(application)
.setBundleAssetName("index.android.bundle")
.setJSMainModulePath("index")
.addPackage(new MainReactPackage())
.addPackage(new MyTestPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
这很难发现,特别是在使用依赖注入时:)。
我创建了一个doc update here的请求。
答案 3 :(得分:0)
对于将来遇到此问题的任何人,并认为此错误是由于本机库在构建期间未正确链接的结果: 按照manual installation instruction of linking libraries
上的第2步操作单击您的主项目文件(代表.xcodeproj的文件)选择Build Phases并将静态库从您要导入的Library中的Products文件夹拖到Link Binary With Libraries
我们的想法是确保在构建react-native使用的本机库时包含自定义本机库。
答案 4 :(得分:0)
如果将本机模块错误地导入另一个JavaScript文件,也会发生此错误。例如,如果您要导入本机模块,请执行以下操作:
// ScaleControllerNativeModule.js
import { NativeModules } from 'react-native';
module.exports = NativeModules.ScaleController;
然后使用命名导入导入它:
import { ScaleController } from './ScaleControllerNativeModule';
你会得到“未定义的不是对象”错误。
而是使用默认导入(不含{}
),例如:
import ScaleController from './ScaleControllerNativeModule';