Fixed
Status Update
Comments
ap...@google.com <ap...@google.com> #2
Yigit, do you have time to fix it?
reemission of the same liveData is racy
reemission of the same liveData is racy
ap...@google.com <ap...@google.com> #3
yea i'll take it.
ap...@google.com <ap...@google.com> #4
Thanks for the detailed analysis. This may not be an issue anymore since we've started using Main.immediate there but I' not sure; I'll try to create a test case.
jb...@google.com <jb...@google.com> #5
just emitting same live data reproduces the issue.
@Test
fun raceTest() {
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData)
emitSource(subLiveData) //crashes
}
subject.addObserver().apply {
testScope.advanceUntilIdle()
}
}
@Test
fun raceTest() {
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData)
emitSource(subLiveData) //crashes
}
subject.addObserver().apply {
testScope.advanceUntilIdle()
}
}
Description
The visibleEntries stateFlow that is currently offered as an experimental API on NavController is populated based on the current lifecycle state of the entry. This means that it considers the hostLifecycleState of the entry when determining whether entries should be part of the list.
Because of this, when the navController is first created, depending on the lifecycle state when you call setGraph, it is possible for the visibleEntries to be empty until after the first navigate call. Also, if the hostLifecycle state is forced down, as in the case of using nested NavHost with different NavControllers in navigation-compose, entries are immediately removed from the list of visible entries although they might still be visible because of animations.
We should visible visible entries so that is always contains any entry that actually should be considered visible.