【问题标题】:Error: @"Bridge module %@ does not conform to RCTBridgeModule"错误:@“桥接模块 %@ 不符合 RCTBridgeModule”
【发布时间】:2018-01-22 15:24:03
【问题描述】:

我是 React Native 的新手,我想使用原生模块来获取手机的电池状态。问题是我遇到了错误:@“桥模块%@ 不符合 RCTBridgeModule”。我猜它与类相关,但我不熟悉 Objective-C 语法。 即使答案很简单,我也非常感谢这个领域的任何帮助。谢谢!

我的 BatteryStatus.h 如下所示:

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule>
@end

我的 BatteryStatus.m 如下所示:

#import "BatteryStatus.h"

@implementation BatteryStatus
RCT_EXPORT_MODULE(BatteryStatus)

- (instancetype)init
{
  if ((self = [super init])) {

    [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];

  }
  return self;
}

RCT_EXPORT_METHOD(hide) {
}

RCT_EXPORT_METHOD(updateBatteryLevel:(RCTResponseSenderBlock)callback)
{
  callback(@[[self getBatteryStatus]]);
}

//manually get battery status by calling following method

-(NSDictionary*)getBatteryStatus
{

  float batteryLevel = [UIDevice currentDevice].batteryLevel;

  NSObject* currentLevel = nil;

  currentLevel = [NSNumber numberWithFloat:(batteryLevel * 100)];

  NSMutableDictionary* batteryData = [NSMutableDictionary dictionaryWithCapacity:2];

  [batteryData setObject:currentLevel forKey:@"level"];
  return batteryData;

}

@end

我正在尝试像这样在 React Native 中使用它:

import { Text, View, NativeModules } from 'react-native';
import React, { Component } from 'react';

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
    batteryLevel: null,
    };
   }

   componentDidMount() {
     NativeModules.BatteryStatus.updateBatteryLevel((info) => {
     console.log(info.level);
     const level = Math.ceil(info.level);
     this.setState({ batteryLevel: level });
     });
   }
render() {
    return (
      <View>
        <Text>TEST</Text>
      </View>
    );
  }
}


export default App;

【问题讨论】:

    标签: objective-c react-native react-native-ios


    【解决方案1】:

    在您的情况下,您不应该从RCTEventEmitter 继承。仅当您想将事件从本机模块发送到侦听模块的特定事件的 JS 时,您才需要这样做;在这种情况下,您需要在本机模块中实现 supportedEvents 方法并指定您支持的事件的名称。 您收到此异常是因为您没有实现此方法。

    由于您没有发送任何事件,BatteryStatus 应该只继承基本的 NSObject 类,如下所示:

    @interface BatteryStatus : NSObject <RCTBridgeModule>
    @end
    

    我建议您查看创建 native ios modules 的 RN 指南。

    【讨论】:

    • 你是对的!谢谢你。我肯定会查看 RN 指南,但首先需要在没有 Objective-C 的情况下了解更多 RN 本身。无论如何,谢谢你,它帮助了很多!
    • 您好 Artal,如果我想要模块中的类 native 有:javascript 侧调用的侦听器和方法,我该怎么办?我正在寻找解决办法。提前致谢。
    • @vannguyen 如果你想将事件从原生发送到 JS,你的类需要继承自 RCTEventEmitter
    • 感谢您的回复。我的意思是我有一个从 RCTEventEmitter 继承的模块。在javascript方面,当componentDidMount和componentWillUnMount时,我调用add Listener和remove Listener。 @interface DeeplinkManager : RCTEventEmitter - 我想:在javascript方面,我想调用DeepLinkManager的一个方法。例如:DeepLinkManager.functionA();我尝试添加 functionA(),但它的错误:functionA() 未定义...非常感谢。
    • @vannguyen 很难说,这与这个问题中提到的问题不同。如果您仍然需要帮助,我建议您提出一个新问题并添加您无法使用的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2018-02-18
    • 1970-01-01
    • 2014-08-20
    • 2023-03-19
    • 2013-02-27
    • 2019-09-23
    相关资源
    最近更新 更多