Status Update
Comments
an...@google.com <an...@google.com>
za...@gmail.com <za...@gmail.com> #2
za...@gmail.com <za...@gmail.com> #3
It looks like at least some of these issues are still present in 1.0.1, although I need to update the repro project to verify. I’ve been
Ian pointed out that composition locals that are set by a parent composition are generally visible to/inherited by subcompositions, even if there are Android views in between. However, in this particular case, that does not matter because the Wrapper will always explicitly set the values of the lifecycle and state registry locals to the values it got from the view tree, overriding any values coming in from the parent composition.
As far as I can tell from reading the code myself, I think the solution is just that AndroidView needs to set the ViewTreeLifecycleOwner and ViewTreeSavedStateRegistryOwner from the LocalLifecycleOwner and LocalSavedStateRegistry, respectively, on the Android view it creates. Then, any descendant views will see the correct owners if they were overridden in the composition, and any nested compositions will also get those owners and set them as the local values for their compositions.
an...@google.com <an...@google.com>
za...@gmail.com <za...@gmail.com> #4
Confirming the issue affects Jetpack Navigation as well.
I just updated the repro project to Compose 1.0.1 and added a demonstration of the issue affecting Jetpack Navigation.
po...@google.com <po...@google.com>
kl...@google.com <kl...@google.com>
kl...@google.com <kl...@google.com> #5
kl...@google.com <kl...@google.com> #6
Filed
ap...@google.com <ap...@google.com> #7
Branch: androidx-main
commit 11a26697f42c3a6d4a248eb35f52d2c26bd6d9cf
Author: Zach Klippenstein <klippenstein@google.com>
Date: Thu Sep 16 16:46:51 2021
Propagate local owners as view tree owners in AndroidView.
Propagates the LocalLifecycleOwner and LocalSavedStateRegistryOwner from
an AndroidView to the managed View by setting ViewTreeLifecycleOwner and
ViewTreeSavedStateRegistryOwner, respectively, on the AndroidViewHolder.
This ensures that, if something in the composition (e.g. a navigation
library like Jetpack Navigation Compose) sets those locals to
owners that are different from the ones used to create the composition
itself, any Android Views nested beneath them will see those owners and
not the ones used by the composition.
Test: Added tests to AndroidViewTest
Fixes:
Relnote: "AndroidView now propagates LocalLifecycleOwner and
LocalSavedStateRegistryOwner to its view via ViewTreeLifecycleOwner
and ViewTreeSavedStateRegistryOwner."
Change-Id: I38f966576085db66e35b0106f49275ef5bb31adc
M compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.android.kt
Description
Jetpack Compose release version: 1.0.0-alpha11
Android Studio Build:
This requires a bit of setup to reproduce, and there are a number of issues that require similar setup, so I have created a dedicated repo that demonstrates and has UI tests for them here .
The README in the root of that repo describes the setup, the issues, and the fixes to them that make sense to me.
These issues will probably affect the Compose integration for the Jetpack Navigation library, as well as other navigation libraries that are written in Compose.