Отправка событий в JS React Native - PullRequest
0 голосов
/ 02 мая 2019

Я реализовал в передатчике событий Objective C React Native, где я создал класс эмиттера, который отправляет события, чтобы реагировать на нативные и, кажется, работает:

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

@interface PlayerEventsEmitter : RCTEventEmitter <RCTBridgeModule>

@end


#import "PlayerEventsEmitter.h"

@implementation PlayerEventsEmitter
{
   bool hasListeners;
}

RCT_EXPORT_MODULE();

+ (id)allocWithZone:(NSZone *)zone {
   static PlayerEventsEmitter *sharedInstance = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       sharedInstance = [super allocWithZone:zone];
   });
return sharedInstance;
}


- (NSArray<NSString *> *)supportedEvents {
    return @[@"onMediaLoaded", @"onPlaying", @"onPause", @"onError", @"onEnded", @"onBuffering", @"onTimeUpdate", @"onStateUpdate"];
}

- (void)startObserving {
    hasListeners = YES;
}

- (void)stopObserving {
    hasListeners = NO;
}

- (void)sendEventName:(NSString *)eventName body:(id)body {
   if (hasListeners) {
      [self sendEventWithName:eventName body:body];
}
}

@end

Но на JS, когда я делаю это:

import {NativeEventEmitter, NativeModules} from 'react-native';
import isFunction from 'lodash/isFunction';
import noop from 'lodash/noop';
import createMiddleware from './middleware';

const nativeAdapter = NativeModules.RNNativePlayerAdapter; //  eslint-disable-line
const { ModuleWithEmitter } = NativeModules;
const eventEmitter = new NativeEventEmitter(ModuleWithEmitter);

const onMediaLoaded = (event) => {
  console.log(event);
}

const onPlaying = (event) => {
  console.log(event);
}

const subscription1 = eventEmitter.addListener('onMediaLoaded', onMediaLoaded);
const subscription2 = eventEmitter.addListener('onPlaying', onPlaying);

export default class NativeAdapter {
  constructor() {
    console.log('nativeAdapter: ', nativeAdapter);
    console.log('NativeModules: ', NativeModules);

     this.subscription = eventEmitter.addListener(
       'onMediaLoaded',
         (onMediaLoaded) => {
             console.log('onMediaLoaded');
        }
      );
    }
}

Я получаю ошибку: «Нативный модуль не может быть нулевым»

И я точно следовал документации: https://facebook.github.io/react-native/docs/native-modules-ios

Пожалуйста, помогите.

Спасибо, Клаудиу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...