@@ -29,7 +29,6 @@ import androidx.fragment.app.FragmentManager.OnBackStackChangedListener
29
29
import androidx.fragment.app.FragmentTransaction
30
30
import androidx.lifecycle.Lifecycle
31
31
import androidx.lifecycle.LifecycleEventObserver
32
- import androidx.lifecycle.LifecycleOwner
33
32
import androidx.lifecycle.ViewModel
34
33
import androidx.lifecycle.ViewModelProvider
35
34
import androidx.lifecycle.viewmodel.CreationExtras
@@ -75,38 +74,34 @@ public open class FragmentNavigator(
75
74
*/
76
75
internal val backStack get() = state.backStack
77
76
78
- private val fragmentObserver = object : LifecycleEventObserver {
79
- override fun onStateChanged ( source : LifecycleOwner , event : Lifecycle .Event ) {
80
- if (event == Lifecycle . Event . ON_DESTROY ) {
81
- val fragment = source as Fragment
82
- val entry = state.transitionsInProgress.value.lastOrNull { entry ->
83
- entry.id == fragment.tag
84
- }
85
- entry?. let {
86
- entriesToPop.remove (entry.id)
87
- state.markTransitionComplete(it )
77
+ private val fragmentObserver = LifecycleEventObserver { source, event ->
78
+ if ( event == Lifecycle .Event . ON_DESTROY ) {
79
+ val fragment = source as Fragment
80
+ val entry = state.transitionsInProgress.value.lastOrNull { entry ->
81
+ entry.id == fragment.tag
82
+ }
83
+ if (entry != null ) {
84
+ entriesToPop.remove( entry.id)
85
+ if ( ! state.backStack.value.contains (entry)) {
86
+ state.markTransitionComplete(entry )
88
87
}
89
- fragment.lifecycle.removeObserver(this )
90
88
}
91
89
}
92
90
}
93
91
94
92
private val fragmentViewObserver = { entry: NavBackStackEntry ->
95
- object : LifecycleEventObserver {
96
- override fun onStateChanged (
97
- source : LifecycleOwner ,
98
- event : Lifecycle .Event
99
- ) {
100
- // Once the lifecycle reaches RESUMED, we can mark the transition complete
101
- if (event == Lifecycle .Event .ON_RESUME ) {
102
- state.markTransitionComplete(entry)
103
- }
104
- // Once the lifecycle reaches DESTROYED, we can mark the transition complete and
105
- // remove the observer.
106
- if (event == Lifecycle .Event .ON_DESTROY ) {
107
- entriesToPop.remove(entry.id)
93
+ LifecycleEventObserver { _, event ->
94
+ // Once the lifecycle reaches RESUMED, if the entry is in the back stack we can mark
95
+ // the transition complete
96
+ if (event == Lifecycle .Event .ON_RESUME && state.backStack.value.contains(entry)) {
97
+ state.markTransitionComplete(entry)
98
+ }
99
+ // Once the lifecycle reaches DESTROYED, if the entry is not in the back stack, we can
100
+ // mark the transition complete
101
+ if (event == Lifecycle .Event .ON_DESTROY ) {
102
+ entriesToPop.remove(entry.id)
103
+ if (! state.backStack.value.contains(entry)) {
108
104
state.markTransitionComplete(entry)
109
- source.lifecycle.removeObserver(this )
110
105
}
111
106
}
112
107
}
0 commit comments