私の場合: サードパーティのハードウェア デバイスに接続しています。SDK はネイティブなので、それをブリッジして、発生したイベントのリスナーを作成し、RN 側でキャッチする必要があります。一貫した UI を実現するために、また SDK の制限的な性質により、ユーザーがデバイスを使用するたびに新しい接続を作成する必要があります (これはユーザーが吹き込むものです)。そして、新しい接続ごとに、新しいエミッターのセットを作成する必要があります。
私の問題: ネイティブ Android 側 (サード パーティの SDK イベント) でイベントをリッスンする多くのリスナーを登録します。
各エミッターをコンポーネント配列に追加します。画面から移動すると (画面削除イベントではないため、ComponentWillUnmount に依存できません)、配列を反復処理し、各エミッターで remove() を呼び出します。
このページにアクセスするたびに、新しいエミッターを再作成しようとします。ただし、もう一度画面にアクセスすると、コンソールにエミッターを記録しても、古いエミッターはまだイベントを出力しています。
出力例:
"フロー":[null,{"eventType":"フロー","キー":1}]
機能:
constructor(props) {
super(props);
this._STATUS_BAR_HEIGHT = (Platform.OS === "ios" && NativeStatusBarManagerIOS.HEIGHT === 44); // Checks if the system needs to accommodate the Status bar height
this.listeners = [];
this.state = {
...defaultState
}
}
emitterCreation() {
let eventEmitterFlow = globalEmitter.addListener('flow', (flows) => {
console.log("Hello values");
})
this.listeners.push(eventEmitterFlow)
}
cleanUpComponent () {
this.setState({
...defaultState,
})
await MirModule.disconnectDevice(); // Disconnecting from the device
for (const listener of this.listeners) { // removes any outstanding listeners
console.log("Removing listeners");
listener.remove();
}