web-dev-qa-db-fra.com

Viveata observant en fragment

À partir de 2019, j'essaie de suivre une meilleure pratique sur où commencer à observer LiveData en fragments et si je devrais passer this ou viewLifecycleOwner comme paramètre à la observe().

  • Selon cela Documentation officielle de Google , je devrais observer dans onActivityCreated() passe this (fragment) en tant que paramètre.

  • Selon cela google échantillon , je devrais observer dans onViewCreated() passe viewLifecycleOwner comme paramètre.

  • Selon ceci Vidéo d'E/S , je ne devrais pas utiliser this mais plutôt viewLifecycleOwner, mais ne spécifie pas où devrais-je commencer à observer.

  • Selon ces pièges - POST , je devrais observer dans onActivityCreated() et utiliser viewLifecycleOwner.

Alors, où devrais-je commencer à observer? Et devrais-je utiliser this ou viewLifecycleOwner?

26
fernandospr

Si vous observerez à partir d'une activité, vous pouvez observer sur onCreate() et utiliser this pour la vie de cycle de vie comme indiqué ici :

Si vous avez un composant conscient de cycle de vie qui est connecté au cycle de vie de votre activité, il recevra l'événement On_create. La méthode annotée avec @onlifecycleEvent sera appelée de sorte que votre composant de cycle de vie peut effectuer tout code de configuration dont il a besoin pour l'état créé.

Maintenant, si vous observez dans un fragment, vous pouvez observer sur onViewCreated() ou onActivityCreated() et vous devez utiliser getViewLifecycleOwner() et ici est pourquoi:

Obtenez un vœux de vie qui représente le cycle de vie de la vue du fragment. Dans la plupart des cas, cela reflète le cycle de vie du fragment lui-même, mais dans les cas de fragments indépendants, le cycle de vie du fragment peut être considérablement plus long que le cycle de vie de la vue elle-même.

2
Rodrigo Queiroz

Peu importe que vous le fassiez sur onViewCreated ou onActivityCreated. Les deux sont appelés lorsque le fragment est gonflé, onViewCreated d'abord, onActivityCreated par la suite. C'est vraiment une question de préférence.

L'objet LiveData prend un LifecycleOwner, et les deux Fragment et Activity implémente l'interface, vous devez donc avoir besoin de passer this.

0
Francesc

Comme dans l'E/S Talk Yigit dit, le fragment et sa vue ont desecycles différents. Vous auriez besoin d'identifier si votre LiveData est associé au fragment ou à sa vue et transmettez celui désiré. Le compilateur acceptera les deux car les deux sont des implémentations de LifecycleOwner

0
Arka Prava Basu