Skip to content

Commit 6a6d3f8

Browse files
committed
Use NavBackStack instead of a custom BackStack class
1 parent 7c5720d commit 6a6d3f8

File tree

5 files changed

+107
-106
lines changed

5 files changed

+107
-106
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,105 @@
11
package org.jetbrains.kotlinconf.navigation
22

3+
import androidx.navigation3.runtime.NavKey
34
import kotlinx.serialization.SerialName
45
import kotlinx.serialization.Serializable
56
import org.jetbrains.kotlinconf.PartnerId
67
import org.jetbrains.kotlinconf.SessionId
78
import org.jetbrains.kotlinconf.SpeakerId
89

10+
@Serializable
11+
sealed interface AppRoute : NavKey
12+
913
@Serializable
1014
@SerialName("AboutConference")
11-
data object AboutConferenceScreen
15+
data object AboutConferenceScreen : AppRoute
1216

1317
@Serializable
1418
@SerialName("CodeOfConduct")
15-
data object CodeOfConductScreen
19+
data object CodeOfConductScreen : AppRoute
1620

1721
@Serializable
1822
@SerialName("AboutApp")
19-
data object AboutAppScreen
20-
21-
@Serializable
22-
@SerialName("Info")
23-
data object InfoScreen: MainScreenMarker
23+
data object AboutAppScreen : AppRoute
2424

2525
@Serializable
2626
@SerialName("WelcomePrivacyNotice")
27-
data object StartPrivacyNoticeScreen
27+
data object StartPrivacyNoticeScreen : AppRoute
2828

2929
@Serializable
3030
@SerialName("WelcomeSetupNotifications")
31-
data object StartNotificationsScreen
31+
data object StartNotificationsScreen : AppRoute
3232

3333
@Serializable
3434
@SerialName("AppPrivacyNoticePrompt")
35-
data object AppPrivacyNoticePrompt
35+
data object AppPrivacyNoticePrompt : AppRoute
3636

3737
@Serializable
3838
@SerialName("Settings")
39-
data object SettingsScreen
39+
data object SettingsScreen : AppRoute
4040

4141
@Serializable
4242
@SerialName("VisitorPrivacyNotice")
43-
data object VisitorPrivacyNoticeScreen
43+
data object VisitorPrivacyNoticeScreen : AppRoute
4444

4545
@Serializable
4646
@SerialName("AppPrivacyNotice")
47-
data object AppPrivacyNoticeScreen
47+
data object AppPrivacyNoticeScreen : AppRoute
4848

4949
@Serializable
5050
@SerialName("TermsOfUse")
51-
data object TermsOfUseScreen
51+
data object TermsOfUseScreen : AppRoute
5252

5353
@Serializable
5454
@SerialName("AppTermsOfUse")
55-
data object AppTermsOfUseScreen
55+
data object AppTermsOfUseScreen : AppRoute
5656

5757
@Serializable
5858
@SerialName("Licenses")
59-
data object LicensesScreen
59+
data object LicensesScreen : AppRoute
6060

6161
@Serializable
6262
@SerialName("License")
6363
data class SingleLicenseScreen(
6464
val licenseName: String,
6565
val licenseText: String,
66-
)
66+
) : AppRoute
6767

6868
@Serializable
6969
@SerialName("Partners")
70-
data object PartnersScreen
70+
data object PartnersScreen : AppRoute
7171

7272
@Serializable
7373
@SerialName("Partner")
74-
data class PartnerDetailScreen(val partnerId: PartnerId)
74+
data class PartnerDetailScreen(val partnerId: PartnerId) : AppRoute
7575

7676
@Serializable
7777
@SerialName("Main")
78-
data object MainScreen
79-
80-
sealed interface MainScreenMarker
81-
82-
@Serializable
83-
@SerialName("Schedule")
84-
data object ScheduleScreen : MainScreenMarker
78+
data object MainScreen : AppRoute
8579

8680
@Serializable
8781
@SerialName("Session")
8882
data class SessionScreen(
8983
val sessionId: SessionId,
9084
val openedForFeedback: Boolean = false,
91-
)
92-
93-
@Serializable
94-
@SerialName("Speakers")
95-
data object SpeakersScreen: MainScreenMarker
85+
) : AppRoute
9686

9787
@Serializable
9888
@SerialName("Speaker")
99-
data class SpeakerDetailScreen(val speakerId: SpeakerId)
100-
101-
@Serializable
102-
@SerialName("Map")
103-
data object MapScreen: MainScreenMarker
89+
data class SpeakerDetailScreen(val speakerId: SpeakerId) : AppRoute
10490

10591
@Serializable
10692
@SerialName("MapDetail")
107-
data class NestedMapScreen(val roomName: String)
93+
data class NestedMapScreen(val roomName: String) : AppRoute
10894

10995
@Serializable
110-
@SerialName("News")
111-
data object NewsListScreen
96+
@SerialName("NewsList")
97+
data object NewsListScreen : AppRoute
11298

11399
@Serializable
114-
@SerialName("News")
115-
data class NewsDetailScreen(val newsId: String)
100+
@SerialName("NewsDetail")
101+
data class NewsDetailScreen(val newsId: String) : AppRoute
116102

117103
@Serializable
118104
@SerialName("DeveloperMenu")
119-
data object DeveloperMenuScreen
105+
data object DeveloperMenuScreen : AppRoute
Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
11
package org.jetbrains.kotlinconf.navigation
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.mutableStateListOf
5-
import androidx.compose.runtime.remember
4+
import androidx.compose.runtime.saveable.rememberSerializable
5+
import androidx.navigation3.runtime.NavBackStack
6+
import androidx.navigation3.runtime.NavKey
7+
import androidx.navigation3.runtime.serialization.NavBackStackSerializer
8+
import kotlinx.serialization.serializer
69

710
@Composable
8-
fun <T : Any> rememberBackstack(initial: T): BackStack<T> = remember { BackStack(initial) }
9-
10-
class BackStack<T>(initial: T) {
11-
private val _backStack = mutableStateListOf(initial)
12-
val backStack: List<T> get() = _backStack
13-
14-
fun edit(actions: MutableList<T>.() -> Unit) {
15-
_backStack.actions()
16-
}
17-
18-
fun add(element: T, clearOthers: Boolean = false) {
19-
_backStack.add(element)
20-
21-
if (clearOthers) {
22-
_backStack.removeRange(0, _backStack.lastIndex)
23-
}
24-
}
25-
26-
fun pop() {
27-
_backStack.removeAt(_backStack.lastIndex)
11+
inline fun <reified T : NavKey> rememberNavBackStack(vararg elements: T): NavBackStack<T> {
12+
return rememberSerializable(serializer = NavBackStackSerializer(serializer())) {
13+
NavBackStack(*elements)
2814
}
2915
}

0 commit comments

Comments
 (0)