3
votes

React Native: AppState.addEventListener enregistrant des événements en double lors de la reprise en appuyant sur une notification

J'ai du code que je souhaite exécuter lorsque mon application reprend à partir de l'arrière-plan. À cette fin, j'enregistre un événement en utilisant AppState.addEventListener ().

  const handleAppStateChange = () => {
    console.log('Do stuff')
  }

  constructor(props: Props) {
    super(props)
    AppState.addEventListener('change', this.handleAppStateChange)
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange)
  }

Lorsque je quitte normalement l'application et que je la reprends, elle imprime 'do stuff' comme prévu, cependant (et voici le problème), lorsque l'application est réduite et que je tape sur une notification, l'application imprimera deux fois `` Faire des choses ''.

J'ai compris que c'est parce que lorsque j'appuie sur une notification, elle semble réexécuter l'application (y compris la partie constructeur), ce qui signifie qu'elle crée un deuxième écouteur d'événements ...

Alors, est-ce que quelqu'un sait pourquoi il fait cela en appuyant sur une notification et si je peux l'empêcher (en utilisant le plugin react-native-push-notification), ou bien s'il existe un moyen de m'assurer que les événements en double ne sont pas enregistré?

Cela se produit sur mon appareil physique Android, je ne sais pas s'il s'agit également d'un problème iOS, mais j'ai juste pensé que je vérifierais si quelqu'un savait si c'était possible)


2 commentaires

componentDidMount est probablement meilleur pour votre abonnement à un événement. Peut-être que c'est aussi tout votre problème, pourquoi il est parfois abonné mais pas abonné.


J'ai testé cela merci, mais je pense que le problème n'est pas nécessairement lié à cela (mais vous pouvez dire que c'est probablement un meilleur endroit pour le mettre)


3 Réponses :


3
votes

Donc, après beaucoup d'agonie, j'ai réussi à trouver une solution. Ce n'est pas génial, mais fait le travail pour le moment.

if (AppState._eventHandlers.change.size === 0) {
  AppState.addEventListener('change', this.handleAppStateChange)
}

Je pense que la page AppState https://facebook.github.io/react-native/docs/appstate , est terriblement inadéquat, et c'est pourquoi la seule option que je pourrais voir en ce moment est cette méthode privée . Je vais essayer de faire un suivi avec l'équipe si cela peut être amélioré, car il serait logique que, dans certains cas, vous ne souhaitiez pas que les événements dupliqués soient enregistrés.


1 commentaires

Maintenant, j'ai cette erreur tsc: erreur TS2339: la propriété «_eventHandlers» n'existe pas sur le type «AppStateStatic».



0
votes

La réponse ci-dessus est toujours la bonne, mais cela peut provoquer des plantages sur iOS 13. Cela fonctionne bien sur Android.

Ma suggestion est de vérifier explicitement Android:

if (Platform.OS === 'android' && AppState._eventHandlers.change.size === 0)


1 commentaires

Qu'est-ce que cela provoque et pourquoi? Heureux de mettre à jour ma réponse si vous pouvez confirmer.



0
votes

Quand j'ai utilisé

AppState.addEventListener('change', controlSocketConnection);
function controlSocketConnection() { // some code }

AppState.addEventListener ('change', this.handleAppStateChange) } J'ai eu cette erreur:

Now I have this tsc error: error TS2339: Property '_eventHandlers' does not exist on type 'AppStateStatic'.

Donc, je l'ai annulée, puis j'ai résolu AppState.addEventListener en enregistrant des événements en double lors de la reprise en appuyant sur une notification, en modifiant la fonction de flèche pour qu'elle fonctionne dans ce manière:

if (AppState._eventHandlers.change.size === 0) {


0 commentaires