2016-01-28 95 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的請求。

相關問題