Fixed
Status Update
Comments
cl...@google.com <cl...@google.com>
ap...@google.com <ap...@google.com> #2
There is indeed an issue in how we maintain the back stack that is the root cause of this issue and we'll fix that.
Note that this issue occurs in your code because you have the onboarding Fragment as the start destination of your graph, something that is specifically not supported:https://developer.android.com/guide/navigation/navigation-principles#fixed_start_destination - this is also what causes all of your destinations to remain on the back stack (i.e., Home, List, Home all exist on the back stack, rather than being cleared out) as NavigationUI assumes you are doing the correct thing regarding your start destination.
As per the conditional navigation documentation (https://developer.android.com/guide/navigation/navigation-conditional#first-time_user_experience ), you should be launching your onboarding flow from your actual start destination and not using it as a start destination itself.
Note that this issue occurs in your code because you have the onboarding Fragment as the start destination of your graph, something that is specifically not supported:
As per the conditional navigation documentation (
Description
Version of Gradle Plugin: 4.2.0-alpha01
Version of Gradle: 6.5-rc-1
Version of Java: 8
OS: Windows 10
Steps to Reproduce:
@Composable
fun content() {
VerticalScroller {
for (i in 0..10){
embeddedHorizontalScroll()
}
}
}
@Composable
fun embeddedHorizontalScroll() {
HorizontalScroller {
for(i in 0..10){
Text(text = i.toString())
}
}
}
Crashes with log:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.blackcube.moviessearcher, PID: 1096
java.lang.IllegalArgumentException: Key 1288834201 was already registered. Please call unregister before registering again
at androidx.ui.savedinstancestate.UiSavedStateRegistryImpl.registerProvider(UiSavedStateRegistry.kt:97)
at androidx.ui.savedinstancestate.ValueProvider.updateAndReturnValue(RememberSavedInstanceState.kt:101)
at androidx.ui.savedinstancestate.RememberSavedInstanceStateKt.rememberSavedInstanceState(RememberSavedInstanceState.kt:66)
at androidx.ui.foundation.ScrollerKt.ScrollerPosition(Scroller.kt:69)
at androidx.ui.foundation.ScrollerKt.HorizontalScroller(Scroller.kt:260)
at com.blackcube.moviessearcher.ui.GenresScreenKt.embeddedHorizontalScroll(GenresScreen.kt:56)
at com.blackcube.moviessearcher.ui.GenresScreenKt$content$1.invoke(GenresScreen.kt:49)
at com.blackcube.moviessearcher.ui.GenresScreenKt$content$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.ColumnKt$Column$1.invoke(Column.kt:74)
at androidx.ui.layout.ColumnKt$Column$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:122)
at androidx.ui.layout.RowColumnImplKt.RowColumnImpl(RowColumnImpl.kt:66)
at androidx.ui.layout.ColumnKt.Column(Column.kt:68)
at androidx.ui.foundation.ScrollerKt$VerticalScroller$1.invoke(Scroller.kt:231)
at androidx.ui.foundation.ScrollerKt$VerticalScroller$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.foundation.ScrollerKt.ScrollerLayout(Scroller.kt:316)
at androidx.ui.foundation.ScrollerKt.access$ScrollerLayout(Unknown Source:0)
at androidx.ui.foundation.ScrollerKt$Scroller$2.invoke(Scroller.kt:296)
at androidx.ui.foundation.ScrollerKt$Scroller$2.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.PassThroughLayout(Layout.kt:214)
at androidx.ui.semantics.SemanticsKt.Semantics(Semantics.kt:46)
at androidx.ui.foundation.ScrollerKt.Scroller(Scroller.kt:283)
at androidx.ui.foundation.ScrollerKt.VerticalScroller(Scroller.kt:230)
at com.blackcube.moviessearcher.ui.GenresScreenKt.content(GenresScreen.kt:47)
at com.blackcube.moviessearcher.ui.GenresScreenKt.GenresScreen(GenresScreen.kt:41)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1$1.invoke(UiMoviesApp.kt:21)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.SurfaceKt$Surface$1.invoke(Surface.kt:101)
at androidx.ui.material.SurfaceKt$Surface$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.material.SurfaceKt.SurfaceLayout(Surface.kt:123)
at androidx.ui.material.SurfaceKt.Surface-maZXub8(Surface.kt:91)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1.invoke(UiMoviesApp.kt:19)
E/AndroidRuntime: at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$2$1$1.invoke(Crossfade.kt:81)
at androidx.ui.animation.CrossfadeKt$Crossfade$2$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1$1.invoke(Crossfade.kt:71)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Stack.kt:50)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.layout.StackKt.Stack(Stack.kt:52)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1.invoke(Crossfade.kt:70)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$2.invoke(Crossfade.kt:80)
at androidx.ui.animation.CrossfadeKt$Crossfade$2.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Stack.kt:50)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.layout.StackKt.Stack(Stack.kt:52)
at androidx.ui.animation.CrossfadeKt.Crossfade(Crossfade.kt:76)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.appContent(UiMoviesApp.kt:18)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$UIMoviesApp$1.invoke(UiMoviesApp.kt:12)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$UIMoviesApp$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appTheme$1.invoke(UiMoviesApp.kt:32)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appTheme$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.foundation.TextKt.ProvideTextStyle(Text.kt:231)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:66)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:61)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1.invoke(Unknown Source:14)
E/AndroidRuntime: at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.ColorKt.ProvideColorPalette(Color.kt:307)
at androidx.ui.material.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:59)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.appTheme(UiMoviesApp.kt:31)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.UIMoviesApp(UiMoviesApp.kt:11)
at com.blackcube.moviessearcher.ui.MainActivity$onCreate$1.invoke(MainActivity.kt:14)
at com.blackcube.moviessearcher.ui.MainActivity$onCreate$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3$1.invoke(SelectionContainer.kt:100)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.core.selection.SelectionContainerKt.Wrap(SelectionContainer.kt:156)
at androidx.ui.core.selection.SelectionContainerKt.access$Wrap(Unknown Source:0)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3.invoke(SelectionContainer.kt:99)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.core.selection.SelectionContainerKt.SelectionContainer(SelectionContainer.kt:96)
at androidx.ui.core.selection.SelectionContainerKt.SelectionContainer(SelectionContainer.kt:55)
at androidx.ui.core.WrapperKt.WrapWithSelectionContainer(Wrapper.kt:168)
at androidx.ui.core.WrapperKt.access$WrapWithSelectionContainer(Unknown Source:0)
at androidx.ui.core.WrappedComposition$setContent$1$1.invoke(Wrapper.kt:248)
at androidx.ui.core.WrappedComposition$setContent$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.core.WrapperKt.WrapWithAmbients(Wrapper.kt:325)
at androidx.ui.core.WrapperKt.access$WrapWithAmbients(Unknown Source:0)
at androidx.ui.core.WrappedComposition$setContent$1.invoke(Wrapper.kt:247)
at androidx.ui.core.WrappedComposition$setContent$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.ComposerKt.invokeComposable(Composer.kt:2302)
at androidx.compose.Recomposer.recompose$compose_runtime_release(Recomposer.kt:77)
at androidx.compose.CompositionImpl.setContent(Composition.kt:120)
at androidx.ui.core.WrappedComposition.setContent(Wrapper.kt:246)
at androidx.ui.core.WrappedComposition$setContent$2.invoke(Wrapper.kt:257)
at androidx.ui.core.WrappedComposition$setContent$2.invoke(Unknown Source:2)
at androidx.ui.core.SavedStateDelegate.stopWaitingForStateRestoration(SavedStateDelegate.kt:83)
at androidx.ui.core.AndroidComposeView.onMeasure(AndroidComposeView.kt:321)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
E/AndroidRuntime: at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
at android.view.View.measure(View.java:22071)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I/zygote: Do partial code cache collection, code=29KB, data=28KB
I/zygote: After code cache collection, code=29KB, data=28KB
Increasing code cache capacity to 128KB
The reason is here as I understand:
@Composable
fun <T : Any> rememberSavedInstanceState(
vararg inputs: Any?,
saver: Saver<T, out Any> = autoSaver(),
key: String? = null,
init: () -> T
): T {
val finalKey = if (!key.isNullOrEmpty()) {
key
} else {
currentComposer.currentCompoundKeyHash.toString()
}
val registry = UiSavedStateRegistryAmbient.current
val valueProvider = remember(*inputs) { ValueProvider<T>() }
return valueProvider.updateAndReturnValue(registry, saver, finalKey, init)
}
currentComposer.currentCompoundKeyHash returns the same key for every embedded ScrollPosition
If I do not use for-loop then everithing is ok:
@Composable
fun content() {
VerticalScroller {
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
}
}