Я создаю приложение Musi c, в котором компонент мини-плеера содержит экземпляр аудио expo и отделен от навигатора нижней вкладки по двум важным причинам:
1 - экземпляр аудио находится в этом Компонент мини-проигрывателя, поэтому навигация не будет сбрасывать его.
2 - мини-проигрыватель является глобальным, поэтому доступен во всех приложениях и на вкладках.
Собственный модуль не может быть нулевым 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: