"'未定义'不是一个对象"来自React Native的Native Module

时间:2016-01-28 03:54:01

标签: ios objective-c react-native

尝试调用本机模块中的方法时出现以下错误:

'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));

我已经看过我见过的例子,不知道这里有什么问题。

5 个答案:

答案 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';