-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMultiNavGraph.kt
62 lines (55 loc) · 2.19 KB
/
MultiNavGraph.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
package com.afzaln.funcompose.navigation.bottomnav
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.afzaln.funcompose.navigation.PhraseDetail
import com.afzaln.funcompose.navigation.Screen
import com.afzaln.funcompose.navigation.simple.Phrases
@Composable
fun MultiBottomNavApp() {
BottomNavApp {
MultiNavTabContent(screen = it)
}
}
@Composable
fun MultiNavTabContent(screen: Screen) {
val dashboardNavState = rememberSaveable(saver = NavStateSaver()) { mutableStateOf(Bundle()) }
val phrasesNavState = rememberSaveable(saver = NavStateSaver()) { mutableStateOf(Bundle()) }
when (screen) {
Screen.Profile -> ProfileTab()
Screen.Dashboard -> DashboardTab(dashboardNavState)
Screen.Phrases -> NavPhrases(phrasesNavState)
else -> ProfileTab()
}
}
@Composable
fun NavPhrases(navState: MutableState<Bundle>) {
val navController = rememberNavController()
DisposableEffect(Unit) {
val callback = NavController.OnDestinationChangedListener { navController, _, _ ->
navState.value = navController.saveState() ?: Bundle()
}
navController.addOnDestinationChangedListener(callback)
navController.restoreState(navState.value)
onDispose {
navController.removeOnDestinationChangedListener(callback)
// workaround for issue where back press is intercepted
// outside this tab, even after this Composable is disposed
navController.enableOnBackPressed(false)
}
}
NavHost(
navController = navController,
startDestination = Screen.Phrases.route
) {
composable(Screen.Phrases.route) { Phrases(navController) }
composable(Screen.PhraseDetail.route) { PhraseDetail(it.arguments?.get("phrase") as String) }
}
}