在 React Native 桥上调用方法时,桥为零,使用单例?

Posted

技术标签:

【中文标题】在 React Native 桥上调用方法时,桥为零,使用单例?【英文标题】:Bridge is nil when calling methods on React Native bridge, use a singleton? 【发布时间】:2015-11-30 22:51:14 【问题描述】:

我正在创建自己的自定义组件,以与蓝牙设备进行交互。 I tried this in Swift,但由于访问网桥的问题而没有到达任何地方。

我在 Objective-C 中重新实现了它并遇到了同样的问题 (bridge = nil)。为了修复它,我使用了:

BTAdapter.h

#import "RCTBridgeModule.h"

@interface BTAdapter : NSObject<RCTBridgeModule>
- (void)sendEvent:(NSString *)name;
@end

BTAdapter.m

#import "BTAdapter.h"

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"

@implementation BTAdapter

RCT_EXPORT_MODULE()

@synthesize bridge = _bridge;

+ (id)allocWithZone:(NSZone *) zone

    static BTAdapter *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sharedInstance = [super allocWithZone:zone];
    );
    return sharedInstance;



- (void)sendEvent:(NSString *)name

    NSLog(@"Received generic event in the bridge");
    if (self.bridge == nil) 
        NSLog(@"Bridge is nil"); // This happens normally
     else 
        NSLog(@"Bridge is NOT nil"); // This happens with a singleton
    
    [self.bridge.eventDispatcher sendAppEventWithName:name body:@"Event from the bridge"];

添加到我的Bridging-Header.h:

#import "BTAdapter.h"

我在 Swift 中这样称呼它:

let adapter: BTAdapter = BTAdapter()
adapter.sendEvent("TestEvent")

这是一件坏事吗?我在类似主题上关注了一个相当过时的 React Native GitHub 问题,但围绕这个解决方案并没有太多确定性。 This seems to suggest it's not a good idea at all.

这里有什么问题?

【问题讨论】:

【参考方案1】:

在我删除自己的初始化程序代码之前,我遇到了这个问题。如果您需要配置,我建议您使用RCT_EXPORT_METHOD 调用并准备您的模块。

【讨论】:

谢谢你,你说得对。手动实例化我的桥模块是桥总是为零的原因。 我目前面临同样的问题。如何在不实例化的情况下访问我的模块(来自 Obj-C),即当系统实例化模块时,模块是否存在挂钩或其他东西?有点卡在这个问题上,你的问题看起来最像我的情况。 @stephanmantel AFAIK 没有...您可以使用RCT_EXPORT_METHOD 创建自己的配置方法。像往常一样,请注意指南中有关不进行线程假设等的信息

以上是关于在 React Native 桥上调用方法时,桥为零,使用单例?的主要内容,如果未能解决你的问题,请参考以下文章

AXIOS 调用在 React-Native 0.63 中给出网络错误

在android中安排后台任务并从任务中调用react-native javascript方法

我的 setstate 方法被多次调用,这导致在 React Native 中删除项目时出现问题

react-native--基础(方法调用)

react-native--基础(方法调用)

React-native Android:调用 AppRegistry.runApplication 时出错