Status Update
Comments
jo...@google.com <jo...@google.com>
al...@google.com <al...@google.com> #2
Triage notes: Assigning for a response.
ch...@google.com <ch...@google.com> #3
When updating the providers, startProvider()
is comparing the new scope produces with the previous scope produced, instead of the current parent scope, to determine if the content of the provider needs to change, ignoring if the parent changed. That has the effect of, if a provider provides a value that is identical to the parent value, the composer thinks that none of the the static composition locals changed and it doesn't need to force updates of the content of the provider.
The temporary work-around for this is to use a compositionLocalOf
instead. Using compositionLocalOf
is recommended for composition locals that can change and static should are not recommended for values that can change.
However, in the above example, LocalOtherValue
only changes once so using a staticCompositionLocal
is recommended as it avoids the overhead for tracking reads of a value that rarely changes, making this work-around temporary for LocalOtherValue
or similar locals.
sk...@gmail.com <sk...@gmail.com> #4
hr...@gmail.com <hr...@gmail.com> #5
This issue also affects Material theming changes because they use staticCompositionLocalOf
under the hood. And those cannot be changed by a work-around.
ap...@google.com <ap...@google.com> #6
Project: platform/frameworks/support
Branch: androidx-main
Author: Chuck Jazdzewski <
Link:
Fixed providesDefault
for a single provide
Expand for full commit details
Fixed `providesDefault` for a single provide
If `providesDefault` is used as the sole provided value
of a `CompostionLocalProvider` then the content of the
provider may not update if a parent changes the value
of a static composition local. Providing more than
one value does not have this issue.
Fixes: 374263387
Test: new test, ./gradlew :compose:r:r:test
Change-Id: Iabd4fbba6191abad4073ab5f302d252750683258
Files:
- M
compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
- M
compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
Hash: b70a4268ba4985d4a5baf9c14edd81290d2ded1d
Date: Thu Oct 24 17:16:39 2024
na...@google.com <na...@google.com> #7
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.compose.runtime:runtime:1.8.0-alpha06
androidx.compose.runtime:runtime-android:1.8.0-alpha06
androidx.compose.runtime:runtime-jvmstubs:1.8.0-alpha06
androidx.compose.runtime:runtime-linuxx64stubs:1.8.0-alpha06
Description
Jetpack Compose version: 1.7.1
Jetpack Compose component(s) used: ProvidableCompositionLocal and providesDefault
Android Studio Build: Jellyfish 2023.3.1 Patch 2
Kotlin version: 2.0.21
Steps to Reproduce or Code Sample to Reproduce:
Nesting multiple
providesDefault
for aProvidableCompositionLocal
blocks any changes from other wrapperProvidableCompositionLocals
from being propagated from the root block to the second nested block.Example:
In this example "Second block other value changed" should get printed twice because
LocalOtherValue
is expected to change and trigger theLaunchedEffect
inside the second block but it does not. It only changes inside the "Root block other value changed" and "First block other value changed" blocks.As per my understanding
providesDefault
should only affectLocalValue
.