-
Notifications
You must be signed in to change notification settings - Fork 17
/
ScreenEffectsSampleScreen.kt
86 lines (83 loc) · 3.27 KB
/
ScreenEffectsSampleScreen.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.github.terrakok.modo.sample.screens
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Text
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import com.github.terrakok.modo.ExperimentalModoApi
import com.github.terrakok.modo.Screen
import com.github.terrakok.modo.ScreenKey
import com.github.terrakok.modo.generateScreenKey
import com.github.terrakok.modo.lifecycle.DisposableScreenEffect
import com.github.terrakok.modo.lifecycle.LaunchedScreenEffect
import com.github.terrakok.modo.lifecycle.LifecycleScreenEffect
import com.github.terrakok.modo.sample.screens.base.SampleScreenContent
import com.github.terrakok.modo.sample.screens.base.rememberCounterState
import com.github.terrakok.modo.stack.LocalStackNavigation
import com.github.terrakok.modo.stack.back
import com.github.terrakok.modo.stack.forward
import kotlinx.parcelize.Parcelize
import logcat.logcat
@Parcelize
class ScreenEffectsSampleScreen(
private val screenIndex: Int,
override val screenKey: ScreenKey = generateScreenKey()
) : Screen {
@OptIn(ExperimentalModoApi::class)
@Composable
override fun Content(modifier: Modifier) {
var lifecycleEventsHistory by rememberSaveable {
mutableStateOf(listOf<Lifecycle.Event>())
}
val scaffoldState = rememberScaffoldState()
val counter by rememberCounterState()
// This effect is going to be launched once despite on activity recreation.
LaunchedScreenEffect {
scaffoldState.snackbarHostState.showSnackbar("LaunchedScreenEffect! Counter: $counter.")
}
LifecycleScreenEffect {
LifecycleEventObserver { _, event ->
lifecycleEventsHistory += event
logcat { "Lifecycle event $event. Counter: $counter." }
}
}
DisposableScreenEffect {
logcat { "Analytics: screen created. Counter: $counter." }
onDispose {
logcat { "Analytics: screen destroyed. Counter: $counter." }
}
}
val navigation = LocalStackNavigation.current
SampleScreenContent(
screenIndex = screenIndex,
screenName = "ScreenEffectsSampleScreen",
screenKey = screenKey,
counter = counter,
modifier = modifier,
) {
GroupedButtonsList(
state = remember {
listOf(
ModoButtonSpec("Forward") { navigation.forward(MainScreen(screenIndex + 1)) },
ModoButtonSpec("Back") { navigation.back() }
).let {
ButtonsState(it)
}
}
)
LazyColumn {
items(lifecycleEventsHistory) {
Text(text = it.name)
}
}
}
}
}