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

Commit 26ce76c

Browse files
tmp revert tmp
1 parent 474d6d5 commit 26ce76c

File tree

4 files changed

+15
-160
lines changed

4 files changed

+15
-160
lines changed

compose-backstack-viewer/src/main/java/com/zachklipp/compose/backstack/viewer/AppScreen.kt

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import androidx.compose.material.icons.filled.Add
1616
import androidx.compose.material.icons.filled.ArrowBack
1717
import androidx.compose.material.icons.filled.Menu
1818
import androidx.compose.runtime.*
19-
import androidx.compose.runtime.saveable.Saver
2019
import androidx.compose.runtime.saveable.rememberSaveable
2120
import androidx.compose.ui.Alignment
2221
import androidx.compose.ui.Modifier
@@ -71,18 +70,7 @@ private fun rememberCounter(periodMs: Long): Int = key(periodMs) {
7170
// If the screen is temporarily removed from the composition, the counter will effectively
7271
// be "paused": it will stop incrementing, but will resume from its last value when restored to
7372
// the composition.
74-
var value by rememberSaveable(
75-
stateSaver = Saver(
76-
save = {
77-
println("OMG saving $it")
78-
it
79-
},
80-
restore = {
81-
println("OMG restoring $it")
82-
it
83-
}
84-
)
85-
) { mutableStateOf(0) }
73+
var value by rememberSaveable { mutableStateOf(0) }
8674
DisposableEffect(periodMs) {
8775
val mainHandler = Handler()
8876
var disposed = false

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

Lines changed: 4 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@ package com.zachklipp.compose.backstack
22

33
import androidx.compose.foundation.clickable
44
import androidx.compose.foundation.text.BasicText
5-
import androidx.compose.runtime.Composable
65
import androidx.compose.runtime.DisposableEffect
76
import androidx.compose.runtime.getValue
87
import androidx.compose.runtime.mutableStateListOf
98
import androidx.compose.runtime.mutableStateOf
10-
import androidx.compose.runtime.saveable.Saver
119
import androidx.compose.runtime.saveable.rememberSaveable
12-
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
1310
import androidx.compose.runtime.setValue
1411
import androidx.compose.ui.Modifier
15-
import androidx.compose.ui.layout.SubcomposeLayout
1612
import androidx.compose.ui.test.assertIsDisplayed
13+
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
1714
import androidx.compose.ui.test.junit4.createComposeRule
1815
import androidx.compose.ui.test.onNodeWithText
1916
import androidx.compose.ui.test.performClick
17+
import androidx.test.ext.junit.rules.ActivityScenarioRule
2018
import com.google.common.truth.Truth.assertThat
2119
import org.junit.Rule
2220
import org.junit.Test
@@ -26,108 +24,29 @@ class BackstackStateTest {
2624
@get:Rule
2725
val compose = createComposeRule()
2826

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-
}
45-
}
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-
)) {
76-
println("OMG initializing counter")
77-
mutableStateOf(0)
78-
}
79-
println("OMG composing counter: $counter")
80-
BasicText("$name: $counter", Modifier.clickable {
81-
println("OMG clicked: incrementing counter from $counter")
82-
counter++
83-
})
84-
}
85-
8627
@Test fun screen_state_is_restored_on_pop() {
8728
val backstack = mutableStateListOf("one")
88-
println("OMG ==== 1 ====")
8929
compose.setContent {
9030
Backstack(backstack, frameController = NoopFrameController()) {
91-
// var counter by rememberSaveable { mutableStateOf(0) }
92-
// println("OMG composing counter: $counter")
93-
// BasicText("$it: $counter", Modifier.clickable {
94-
// println("OMG clicked: incrementing counter from $counter")
95-
// counter++
96-
// })
97-
Screen(it)
31+
var counter by rememberSaveable { mutableStateOf(0) }
32+
BasicText("$it: $counter", Modifier.clickable { counter++ })
9833
}
9934
}
10035

10136
// Update some state on the first screen.
10237
compose.onNodeWithText("one: 0").assertIsDisplayed().performClick()
103-
compose.waitForIdle()
104-
println("OMG ==== 2 ====")
10538
compose.onNodeWithText("one: 1").assertIsDisplayed()
10639

107-
// for (i in 0 until 100) {
108-
// Thread.sleep(50)
109-
// compose.mainClock.advanceTimeByFrame()
110-
// }
111-
11240
// Navigate forward to another screen.
11341
backstack += "two"
11442
compose.waitForIdle()
11543

116-
println("OMG ==== 3 ====")
11744
compose.onNodeWithText("one", substring = true).assertDoesNotExist()
11845
compose.onNodeWithText("two: 0").assertIsDisplayed()
11946

12047
// Navigate back.
12148
backstack -= "two"
122-
compose.mainClock.advanceTimeByFrame()
123-
compose.waitForIdle()
124-
compose.mainClock.advanceTimeByFrame()
125-
compose.waitForIdle()
126-
compose.mainClock.advanceTimeByFrame()
127-
compose.waitForIdle()
128-
compose.mainClock.advanceTimeByFrame()
12949
compose.waitForIdle()
130-
println("OMG ==== 4 ====")
13150

13251
// Make sure the state was restored.
13352
compose.onNodeWithText("one: 1").assertIsDisplayed()

compose-backstack/src/main/java/com/zachklipp/compose/backstack/SaveableScreenStateHolder.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ internal class SaveableScreenStateHolder<T>(private val holder: SaveableStateHol
4848
// The only synchronization requirement is that this key is added to the map before
4949
// removeStaleKeys is called after the item is removed from the backstack.
5050
SideEffect {
51-
println("OMG SaveableStateProvider: screenKey=$screenKey, stateKey=$stateKey, existing=${stateKeysByScreenKey[screenKey]}")
5251
val existingStateKey = stateKeysByScreenKey[screenKey]
5352
if (existingStateKey == null) {
5453
stateKeysByScreenKey[screenKey] = stateKey
@@ -76,12 +75,10 @@ internal class SaveableScreenStateHolder<T>(private val holder: SaveableStateHol
7675
* Must only be called from a [SideEffect].
7776
*/
7877
fun removeStaleKeys(backstack: List<T>) {
79-
println("OMG removing stale keys not in ${backstack.joinToString()}")
8078
stateKeysByScreenKey.iterator().apply {
8179
while (hasNext()) {
8280
val (screenKey, stateKey) = next()
8381
if (screenKey !in backstack) {
84-
println("OMG removing $stateKey for $screenKey")
8582
holder.removeState(stateKey)
8683
remove()
8784
}

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

Lines changed: 10 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,70 +3,21 @@ 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 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
6+
import com.zachklipp.compose.backstack.viewer.BackstackViewerApp
237

248
class ComposeBackstackActivity : AppCompatActivity() {
259
override fun onCreate(savedInstanceState: Bundle?) {
2610
super.onCreate(savedInstanceState)
2711
setContent {
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-
}
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+
)
7021
}
7122
}
7223
}

0 commit comments

Comments
 (0)