J'utilise composant de navigation dans mon application. Récemment, il fonctionnait correctement, mais après la mise à jour du projet en AndroidX
, l'erreur navigation destination DESTINATION_NAME is unknown to this NavController
est détectée uniquement si cette destination (que je vais ouvrir) est précédemment fermée de lui-même avec navController.popBackStack()
. De plus, il n'y a pas d'erreur si je ferme le fragment DESTINATION à partir de MainActivity
, mais le message Error only Occurs est fermé à partir de lui-même à l'aide de popBackStack
. comme ci-dessous
DestinationFragment
viewModelOfActivity.handleBackButton.observe(this, Observer {
Navigation.findNavController(requireActivity(), R.id.main_nav_Host).popBackStack()
//CALLING popBackStack() HERE CAUSING PROBLEM WHEN REOPNING THIS DESTINATION(or frg ) AGIAN
})
Activité principale
override fun onBackPressed() {
if (myViewModel.isDefaultBehaviour.value == true) {
super.onBackPressed()
} else{
myViewModel.handleBackButton.value=true
//NO ERROR IF HANDLE BACK BUTTON HERE ie->findNavController(R.id.main_nav_Host).popBackStack()
//INSTEAD OF myViewModel.handleBackButton
}
}
J'ai également vérifié la question liée mais aucune aide Question similaire .
REMARQUE: j'utilise la dernière version de la bibliothèque de navigation (alpha05).
J'utilisais SingleLiveEvent in DestinationFragment pour observer le retour de presse de MainActivity, comme je l'ai déjà mentionné dans ma question. Donc, le problème était dans SingleLiveEvent
J'ai remarqué que j'ai accidentellement changé le code de fun observe(owner: LifecycleOwner, observer: Observer<in T>)
en
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, observer)//Here is problem I was calling super twice in function
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
Vous voyez ici que j'appelais deux fois la fonction super
qui appelle onChanged
d'observateur deux fois dans Fragment
, le code ci-dessous est appelé deux foisNavigation.findNavController(requireActivity(), R.id.main_nav_Host).popBackStack()
Quelle popBackStack()
deux fois.
Ensuite, j'ai changé la fonction observe
comme ci-dessous
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
Maintenant, mon code fonctionne bien
La valeur précédente existe probablement encore dans le modèle de vue et se déclenche immédiatement. Je vous recommande d'utiliser une interface pour gérer votre délégation de bouton arrière au lieu d'un observateur. Cela devrait régler l'utilisation.
Ce qui se passe, c’est que vous remontez trop loin dans votre pile au point de ne plus avoir de graphique actif. Cela se produit parce que votre observateur se déclenche plus souvent qu'il ne le devrait. Pour voir cela, je recommanderais de déboguer cette ligne et d'inspecter le graphique juste avant un crash. Cela risque d'être nul.