React Native ~ 0.61.4 Emitter, вызывающий cra sh on IOS? - PullRequest
0 голосов
/ 30 января 2020

Я создаю приложение Musi c, в котором компонент мини-плеера содержит экземпляр аудио expo и отделен от навигатора нижней вкладки по двум важным причинам:

1 - экземпляр аудио находится в этом Компонент мини-проигрывателя, поэтому навигация не будет сбрасывать его.

2 - мини-проигрыватель является глобальным, поэтому доступен во всех приложениях и на вкладках.

Я использую NativeEventEmitter, чтобы помочь мне управлять действиями игрока (ie: Play / Pause; Next; Pervious;), поскольку эти функции находятся в этом компоненте мини-плеера и должны вызываться с экрана стека внутри навигатора вкладок! ,

Теперь в Android он работает нормально, но в IOS он вызывает приложение к cra * sh.

Ошибка:

Собственный модуль не может быть нулевым 1019 *

Logi c, который я здесь реализую, при нажатии на компонент miniPlayer после его установки, я скрываю его и перехожу на экран игрока Player Screen;

:

...
class PlayerScreen extends Component {
  constructor(props) {
    super(props);
    this.eventEmitter = new NativeEventEmitter();
    this._handleNext = this._handleNext.bind(this);
    this._handlePlayPause = this._handlePlayPause.bind(this);
    this._handlePrevious = this._handlePrevious.bind(this);
    this.state = {
      time: "00:00"
    };
  }

  componentDidMount() {

  }

  _handlePlayPause = () => {
    this.eventEmitter.emit("PLAYPAUSE", "");
  };

  _handleNext = () => {
    this.eventEmitter.emit("NEXTSONG", "");
  };

  _handlePrevious = () => {
    this.eventEmitter.emit("PREVIOUSSONG", "");
  };

  _handleStop = () => {
    this.eventEmitter.emit("STOPSONG", "");
  };
...
render()
....

Компонент MiniPlayer:

componentDidMount() {
    this.listener = DeviceEventEmitter.addListener("PLAYPAUSE", data => {
      this._handlePlayAndPause();
      console.log("New Event is registered At Listeners PLAY_PAUSE");

    });
    this.listenerN = DeviceEventEmitter.addListener("NEXTSONG", data => {
      this._handleNextSong()
      console.log("New Event is registered At Listeners NEXT_SONG ");

    });
    this.listenerP = DeviceEventEmitter.addListener("PREVIOUSSONG", data => {
     this._handlePreviousSong()
      console.log("New Event is registered At Listeners PREVIOUS_SONG");

    });

    this.listenerS = DeviceEventEmitter.addListener("STOPSONG", data => {
      this._handleStopSong();
      console.log("New Event is registered At Listeners STOPSONG");
    }) 

Согласно некоторым статьям на Medium:

React Native больше не включает Узел Стандартная библиотека. Тем не менее, существуют отдельные модули, в которых реализован API-интерфейс EventEmitter.

Глядя на базовый класс NativeEventEmitter.js Abstract, я вижу это в конструкторе.

const EventEmitter = require('../vendor/emitter/EventEmitter');
const Platform = require('../Utilities/Platform');
const RCTDeviceEventEmitter = require('./RCTDeviceEventEmitter');

const invariant = require('invariant');

...

class NativeEventEmitter extends EventEmitter {
  _nativeModule: ?NativeModule;

  constructor(nativeModule: ?NativeModule) {
    super(RCTDeviceEventEmitter.sharedSubscriber);
    if (Platform.OS === 'ios') {
      invariant(nativeModule, 'Native module cannot be null.'); <== This where it crashes
      this._nativeModule = nativeModule;
    }
  }

Обновление:

Я создал закуску с двумя компонентами, которые воспроизводят то, чего я пытаюсь достичь:

https://snack.expo.io/@git / github.com / oflarcade / customEventsExpo

на Android работает нормально / на IOS:

enter image description here

...