2016-01-28 64 views
2

我正在试图在本机模块调用方法时出现以下错误:“‘未定义’不是一个对象”从本机模块在阵营本地

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

我跟着我见过的例子和不知道这里有什么错误..

+1

您是否重新运行打包程序? – stan229

+0

你是什么意思 - 重新启动节点? – Adamski

+0

它与这有什么关系? https://github.com/GeekyAnts/NativeBase/issues/851 – Martian2049

回答

12

通常情况下,如果一个模块的前缀为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

奇怪的是,这个问题是通过将模块从RCTScaleController重命名为ReactScaleController解决。

任何人都知道为什么?有关RCT是内部React模块的前缀?

+0

哇,谢谢你指出这一点。本地模块教程使用RCT前缀,所以我永远不会想到这一点。 – sbaar

+1

进入同样的问题..我添加了一些更一般的答案。您实际上不必重命名您的模块。 – Andru

0

对于将来遇到此问题的任何人并且认为此错误是由于本机库在生成时间期间未正确链接所致: 请按照步骤2上的manual installation instruction of linking libraries

Click on your main project file (the one that represents the .xcodeproj) select Build Phases and drag the static library from the Products folder inside the Library you are importing to Link Binary With Libraries

这个想法是在构建react-native使用的本地库时确保包含自定义本机库。

1

我遇到了这个问题很长一段时间,将React Native添加到现有的Android应用程序。我的问题是,集成React Native,创建本地模块的guide没有提到该包需要在此场景中的ReactInstanceManager实例中声明,而不是在主应用程序文件中声明。对于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(); 

这可能是很难被发现,尤其是在使用依赖注入:)时。

我创建了一个文档更新here的请求。

相关问题