Skip to content

Commit b2c7cf7

Browse files
authored
Fix ComposeSceneLayer.Content not applying the new content when it changes (#2536)
1 parent f410470 commit b2c7cf7

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/scene/ComposeSceneLayer.skiko.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ import androidx.compose.runtime.Composable
2020
import androidx.compose.runtime.CompositionLocalContext
2121
import androidx.compose.runtime.DisposableEffect
2222
import androidx.compose.runtime.currentCompositionLocalContext
23-
import androidx.compose.runtime.getValue
2423
import androidx.compose.runtime.remember
2524
import androidx.compose.runtime.rememberCompositionContext
26-
import androidx.compose.runtime.rememberUpdatedState
2725
import androidx.compose.ui.InternalComposeUiApi
2826
import androidx.compose.ui.geometry.Offset
2927
import androidx.compose.ui.graphics.Color
@@ -209,9 +207,8 @@ internal fun rememberComposeSceneLayer(
209207
*/
210208
@Composable
211209
internal fun ComposeSceneLayer.Content(content: @Composable () -> Unit) {
212-
val currentContent by rememberUpdatedState(content)
213-
DisposableEffect(this) {
214-
setContent(currentContent)
210+
DisposableEffect(this, content) {
211+
setContent(content)
215212
onDispose { }
216213
}
217214
}

compose/ui/ui/src/skikoTest/kotlin/androidx/compose/ui/window/DialogTest.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package androidx.compose.ui.window
1818

1919
import androidx.compose.foundation.layout.Box
2020
import androidx.compose.foundation.layout.size
21+
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.DisposableEffect
2123
import androidx.compose.runtime.LaunchedEffect
2224
import androidx.compose.runtime.getValue
2325
import androidx.compose.runtime.mutableStateOf
@@ -33,6 +35,9 @@ import androidx.compose.ui.geometry.Size
3335
import androidx.compose.ui.input.pointer.PointerButton
3436
import androidx.compose.ui.input.pointer.PointerButtons
3537
import androidx.compose.ui.input.pointer.PointerEventType
38+
import androidx.compose.ui.platform.testTag
39+
import androidx.compose.ui.scene.Content
40+
import androidx.compose.ui.scene.rememberComposeSceneLayer
3641
import androidx.compose.ui.test.ExperimentalTestApi
3742
import androidx.compose.ui.test.InternalTestApi
3843
import androidx.compose.ui.test.assertIsDisplayed
@@ -308,4 +313,36 @@ class DialogTest {
308313
navEventInput.backCompleted()
309314
assertContentEquals(listOf(1, 1, 2, 1), eventList)
310315
}
316+
317+
@Test
318+
fun testComposeSceneLayerSetContent() = runSkikoComposeUiTest {
319+
var useContent2 by mutableStateOf(false)
320+
321+
setContent {
322+
val content1 = @Composable {
323+
Box(Modifier.size(200.dp).testTag("content1"))
324+
}
325+
val content2 = @Composable {
326+
Box(Modifier.size(200.dp).testTag("content2"))
327+
}
328+
329+
val layer = rememberComposeSceneLayer()
330+
layer.Content(if (useContent2) content2 else content1)
331+
DisposableEffect(Unit) {
332+
onDispose {
333+
layer.close()
334+
}
335+
}
336+
}
337+
338+
onNodeWithTag("content1").assertIsDisplayed()
339+
onNodeWithTag("content2").assertDoesNotExist()
340+
341+
useContent2 = true
342+
waitForIdle()
343+
344+
onNodeWithTag("content1").assertDoesNotExist()
345+
onNodeWithTag("content2").assertIsDisplayed()
346+
}
347+
311348
}

0 commit comments

Comments
 (0)