wake-up-neo.com

Navigation DESTINATION_NAME ist diesem NavController nicht bekannt. ReOpening-Fragment, das zuvor mit navController.popBackStack () geschlossen wurde.

Ich verwende die Navigationskomponente in meiner App. Vor kurzem funktionierte sie ordnungsgemäß, aber nach dem Aktualisieren des Projekts auf AndroidX wird der Fehler navigation destination DESTINATION_NAME is unknown to this NavControllernur angezeigt, wenn das Ziel (das ich öffnen möchte) zuvor mit navController.popBackStack() vor sich selbst geschlossen wurde. Es gibt auch keinen Fehler, wenn ich das DESTINATION-Fragment aus MainActivity schließe. Es tritt jedoch nur der Fehler auf, wenn das Fragment aus sich selbst mit popBackStack geschlossen wird. Wie unten

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
})  

Hauptaktivität

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
    }
}

Ich habe auch verwandte Fragen geprüft, aber keine Hilfe Ähnliche Fragen .

HINWEIS: Ich verwende die neueste Version der Navigationsbibliothek (alpha05).

Ich habe SingleLiveEvent in DestinationFragment verwendet, um das Zurückdrücken von MainActivity zu beobachten, da ich dies bereits in meiner Frage erwähnt habe. Das Problem war also in SingleLiveEvent. Ich habe bemerkt, dass ich versehentlich den Code von fun observe(owner: LifecycleOwner, observer: Observer<in T>) in geändert habe 

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*//})
}

Hier können Sie sehen, dass ich zweimal super function aufgerufen habe, wobei onChanged des Beobachters zweimal in Fragment aufgerufen wird. Der folgende Code wird zweimal aufgerufen
Navigation.findNavController(requireActivity(), R.id.main_nav_Host).popBackStack() Welche popBackStack() zweimal.
Dann habe ich die observe-Funktion wie folgt geändert 

@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*//})
}  

Nun funktioniert mein Code gut 

Der vorherige Wert ist wahrscheinlich noch im Ansichtsmodell vorhanden und wird sofort ausgelöst. Ich würde empfehlen, eine Schnittstelle zu verwenden, um die Delegierung der hinteren Tasten anstelle eines Beobachters auszuführen. Das sollte die Verwendung regeln.

Was passiert, ist, dass Sie zu weit oben in Ihrem Back Stack aufspringen, bis zu dem Punkt, an dem Sie keinen aktiven Graphen mehr haben. Dies geschieht, weil Ihr Beobachter öfter ausgelöst wird, als es sollte. Um dies zu sehen, würde ich empfehlen, diese Zeile zu debuggen und das Diagramm direkt vor einem Absturz zu untersuchen. Es ist wahrscheinlich null.

0
Agent 404