web-dev-qa-db-fra.com

Navigation DESTINATION_NAME est inconnu de ce fragment NavController, ReOpening précédemment fermé à l'aide de navController.popBackStack ()?

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 NavControllerest 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).

4

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 fois
Navigation.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 

0

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.

0
Agent 404