反应原生原生模块 RCTBubblingEventBlock 为空

Posted

技术标签:

【中文标题】反应原生原生模块 RCTBubblingEventBlock 为空【英文标题】:React native Native module RCTBubblingEventBlock is null 【发布时间】:2019-09-10 11:28:11 【问题描述】:

尝试从本机模块创建回调,但未触发回调。调用本机模块的代码似乎工作正常,它打开了扫描应用程序,但似乎根本无法让回调工作

这是我的代码。

@objc (ScanImageView)

class ScanImageViewController: UIViewController, ScanningViewControllerDelegate 

  @objc var onImageCapture: RCTBubblingEventBlock?

  @objc
  static func requiresMainQueueSetup() -> Bool 
    return true
  

  @objc func startScan()
    print("What had I created")
    DispatchQueue.main.async 
    self.getTopMostViewController()?.present(ScanningViewController(delegate: self), animated: true)
    
  

  func getTopMostViewController() -> UIViewController? 

    var topMostViewController = UIApplication.shared.keyWindow?.rootViewController

    while let presentedViewController = topMostViewController?.presentedViewController 
      topMostViewController = presentedViewController
    
    return topMostViewController
  

  func scanningViewControllerDidCancel(_ controller: ScanningViewController)   
    print("Dismiss called")
    controller.dismiss(animated: true)
  

  func scanningViewController(_ controller: ScanningViewController, didScan pointCloud: SCPointCloud) 
    print("scanningViewController called")
    print("scanningViewController called")
    if(self.onImageCapture != nil)
    
      let event = ["startTime": "testing"]
      self.onImageCapture!(event)
      controller.dismiss(animated: true)
    
  

这里是 RCT_EXPORT_METHOD() 宏的代码:

#import "React/RCTBridgeModule.h"
#import "React/RCTViewManager.h"

@interface RCT_EXTERN_MODULE(ScanImageView, UIViewController)
RCT_EXTERN_METHOD(startScan)
RCT_EXPORT_VIEW_PROPERTY(onImageCapture, RCTBubblingEventBlock)
@end

.js 文件只有一个按钮,单击该按钮会调用 startScan 方法,并且似乎工作正常。

<button
    onPress=this.turnOn
    title="Turn ON "
    color="#FF6347" 
    onImageCapture=this._onImageCapture/>

根本没有调用的 onImageCapture。在过去的 5 个小时里,我一直在尝试。谁能指导我如何让回调为此工作。

提前致谢。

【问题讨论】:

【参考方案1】:

我找到了使用 sendEvent(withName: "", body: []) 函数的解决方案。必须对我的代码进行以下更改

class ScanImageViewController: UIViewController, ScanningViewControllerDelegate

上面改成

class ScanImageViewController: RCTEventEmitter, ScanningViewControllerDelegate

还得加进去

@objc
  override func supportedEvents() -> [String]! 
    //Event names
    return ["onImageCapture", "onImageCompleted"]
  

在 .js 文件中,您需要添加一个处理程序来监听事件

ScanImageEvents.addListener('onImageCompleted', ( imageData ) => 
      console.log('onImageCompleted')
    )

希望这对某人有所帮助

【讨论】:

以上是关于反应原生原生模块 RCTBubblingEventBlock 为空的主要内容,如果未能解决你的问题,请参考以下文章

这个模块会在 expo 中工作还是反应原生?

如何编写重用通用 JavaScript 代码的反应原生“本机模块”(桥)?

无法找到模块'反应原生'

如何解决“动画:不支持`useNativeDriver`,因为缺少原生动画模块。”在反应导航中?

谷歌地点选择器未打开(反应原生 ios 应用程序)

反应原生模块中的“arm64-v8a”、“x86_64”上的应用程序崩溃