Skip to content
This repository was archived by the owner on Sep 18, 2025. It is now read-only.

Commit 6fc11bd

Browse files
wip aha subcomposelayout is a workaround
1 parent 61eb245 commit 6fc11bd

File tree

2 files changed

+107
-20
lines changed

2 files changed

+107
-20
lines changed

compose-backstack/src/androidTest/java/com/zachklipp/compose/backstack/BackstackStateTest.kt

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import androidx.compose.runtime.mutableStateListOf
99
import androidx.compose.runtime.mutableStateOf
1010
import androidx.compose.runtime.saveable.Saver
1111
import androidx.compose.runtime.saveable.rememberSaveable
12+
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
1213
import androidx.compose.runtime.setValue
1314
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.layout.SubcomposeLayout
1416
import androidx.compose.ui.test.assertIsDisplayed
1517
import androidx.compose.ui.test.junit4.createComposeRule
1618
import androidx.compose.ui.test.onNodeWithText
@@ -24,17 +26,53 @@ class BackstackStateTest {
2426
@get:Rule
2527
val compose = createComposeRule()
2628

27-
@Composable private fun Screen(name: String) {
28-
var counter by rememberSaveable(stateSaver = Saver(
29-
save = {
30-
println("OMG saving $it for $name")
31-
it
32-
},
33-
restore = {
34-
println("OMG restoring $it for $name")
35-
it
29+
@Test fun is_compose_broken() {
30+
var index by mutableStateOf(0)
31+
compose.setContent {
32+
val holder = rememberSaveableStateHolder()
33+
holder.SaveableStateProvider(index) {
34+
SubcomposeLayout { constraints ->
35+
val measurable = subcompose(Unit) {
36+
var counter by rememberSaveable { mutableStateOf(0) }
37+
BasicText("Counter $index: $counter", Modifier.clickable { counter++ })
38+
}.single()
39+
40+
val placeable = measurable.measure(constraints)
41+
layout(placeable.width, placeable.height) {
42+
placeable.placeRelative(0, 0)
43+
}
44+
}
3645
}
37-
)) {
46+
}
47+
48+
// Initial state.
49+
compose.onNodeWithText("Counter 0: 0").assertIsDisplayed()
50+
51+
// Increment counter and check that it's incremented.
52+
compose.onNodeWithText("Counter", substring = true).performClick()
53+
compose.onNodeWithText("Counter 0: 1").assertIsDisplayed()
54+
55+
// Change the index to reset the counter, but save the old value.
56+
index = 1
57+
compose.onNodeWithText("Counter 1: 0").assertIsDisplayed()
58+
59+
// Revert the index to restore the old counter value.
60+
index = 0
61+
compose.onNodeWithText("Counter 0: 1").assertIsDisplayed()
62+
}
63+
64+
@Composable private fun Screen(name: String) {
65+
var counter by rememberSaveable(
66+
stateSaver = Saver(
67+
save = {
68+
println("OMG saving $it for $name")
69+
it
70+
},
71+
restore = {
72+
println("OMG restoring $it for $name")
73+
it
74+
}
75+
)) {
3876
println("OMG initializing counter")
3977
mutableStateOf(0)
4078
}

sample/src/main/java/com/zachklipp/compose/backstack/sample/ComposeBackstackActivity.kt

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,70 @@ package com.zachklipp.compose.backstack.sample
33
import android.os.Bundle
44
import androidx.activity.compose.setContent
55
import androidx.appcompat.app.AppCompatActivity
6-
import com.zachklipp.compose.backstack.viewer.BackstackViewerApp
6+
import androidx.compose.foundation.clickable
7+
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Spacer
9+
import androidx.compose.foundation.layout.height
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.text.BasicText
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.getValue
14+
import androidx.compose.runtime.key
15+
import androidx.compose.runtime.mutableStateOf
16+
import androidx.compose.runtime.remember
17+
import androidx.compose.runtime.saveable.rememberSaveable
18+
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
19+
import androidx.compose.runtime.setValue
20+
import androidx.compose.ui.Modifier
21+
import androidx.compose.ui.layout.SubcomposeLayout
22+
import androidx.compose.ui.unit.dp
723

824
class ComposeBackstackActivity : AppCompatActivity() {
925
override fun onCreate(savedInstanceState: Bundle?) {
1026
super.onCreate(savedInstanceState)
1127
setContent {
12-
BackstackViewerApp(
13-
namedCustomTransitions = listOf("Fancy" to FancyTransition),
14-
prefabBackstacks = listOf(
15-
listOf("one"),
16-
listOf("one", "two"),
17-
listOf("one", "two", "three"),
18-
listOf("two", "one")
19-
)
20-
)
28+
// BackstackViewerApp(
29+
// namedCustomTransitions = listOf("Fancy" to FancyTransition),
30+
// prefabBackstacks = listOf(
31+
// listOf("one"),
32+
// listOf("one", "two"),
33+
// listOf("one", "two", "three"),
34+
// listOf("two", "one")
35+
// )
36+
// )
37+
38+
var index by remember { mutableStateOf(0) }
39+
val holder = rememberSaveableStateHolder()
40+
41+
Column {
42+
BasicText("Index: $index")
43+
BasicText("index++",
44+
Modifier
45+
.clickable { index++ }
46+
.padding(16.dp))
47+
BasicText("index--",
48+
Modifier
49+
.clickable { index-- }
50+
.padding(16.dp))
51+
Spacer(Modifier.height(24.dp))
52+
53+
holder.SaveableStateProvider(index) {
54+
SubcomposeLayout { constraints ->
55+
val measurable = subcompose(Unit) {
56+
var counter by rememberSaveable { mutableStateOf(0) }
57+
BasicText("Counter $index: $counter",
58+
Modifier
59+
.clickable { counter++ }
60+
.padding(16.dp))
61+
}.single()
62+
63+
val placeable = measurable.measure(constraints)
64+
layout(placeable.width, placeable.height) {
65+
placeable.placeRelative(0, 0)
66+
}
67+
}
68+
}
69+
}
2170
}
2271
}
2372
}

0 commit comments

Comments
 (0)