Altynbek Nurtaza
04/08/2021, 6:54 PMvar var1 = rememberSaveable { mutableStateOf(Bundle()) }
var var2 = rememberSaveable { mutableStateOf(Bundle()) }
var var3 = rememberSaveable { mutableStateOf(Bundle()) }
var var4 = rememberSaveable { mutableStateOf(Bundle()) }
var var5 = rememberSaveable { mutableStateOf(Bundle()) }
var var6 = rememberSaveable { mutableStateOf(Bundle()) }
jim
04/08/2021, 6:54 PMAltynbek Nurtaza
04/08/2021, 7:12 PMAltynbek Nurtaza
04/08/2021, 7:12 PMAltynbek Nurtaza
04/08/2021, 7:14 PMAltynbek Nurtaza
04/08/2021, 7:14 PM@Composable
fun BecomePartnerNavigator(
navState: MutableState<Bundle>,
hideNavBar: (Boolean) -> Unit,
startDestination: String = BecomePartnerTab.BecomePartnerRequests.route,
) {
val navController = rememberNavController()
DisposableEffect(true) {
val callback = NavController.OnDestinationChangedListener { controller, _, arguments ->
hideNavBar(arguments?.getString(KEY_ROUTE) != startDestination)
navState.value = controller.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 = startDestination,
) {
BecomePartnerTab.BecomePartnerRequests.content(this, navController)
BecomePartnerTab.BecomePartnerRequest.content(this, navController)
}
}
Altynbek Nurtaza
04/08/2021, 7:16 PMval becomePartnerNavState = rememberSavedInstanceState(saver = NavStateSaver()) { mutableStateOf(Bundle()) }
for each tab I have in my appAltynbek Nurtaza
04/08/2021, 7:17 PMjim
04/08/2021, 7:17 PMjim
04/08/2021, 7:17 PMclass AppData {
var homePageData by mutableStateOf(...)
var aboutPageData by mutableStateOf(...)
var detailsPageData by mutableStateOf(...)
}
Altynbek Nurtaza
04/08/2021, 7:18 PMjim
04/08/2021, 7:19 PMAltynbek Nurtaza
04/08/2021, 7:19 PMenum class BottomNavTab(
@StringRes val title: Int,
val icon: @Composable () -> ImageVector,
val content: @Composable (
navState: MutableState<Bundle>,
hideNavBar: (Boolean) -> Unit
) -> Unit,
) {
HOME(
R.string.home,
{ Icons.Outlined.Home },
{ navState, hideNavBar -> HomeScreen() }),
EXPLORE(
R.string.explore,
{ Icons.Outlined.Explore },
{ navState, hideNavBar -> ExploreScreen() }),
SEARCH(
R.string.search,
{ Icons.Outlined.Search },
{ navState, hideNavBar -> SearchNavigator(hideNavBar) }),
PROFILE(
R.string.profile,
{ Icons.Outlined.Person },
{ navState, hideNavBar -> ProfileNavigator(hideNavBar) }
),
BECOME_PARTNER(
R.string.become_partner,
{ Icons.Outlined.List },
{ navState, hideNavBar -> BecomePartnerNavigator(navState, hideNavBar) }
);
companion object {
fun studentTabs() = arrayOf(EXPLORE, SEARCH, PROFILE)
fun parentTabs() = arrayOf(EXPLORE, SEARCH, PROFILE)
fun employeeTabs() = arrayOf(EXPLORE, SEARCH, PROFILE)
fun teacherTabs() = arrayOf(EXPLORE, SEARCH, PROFILE)
fun adminTabs() = arrayOf(EXPLORE, SEARCH, PROFILE)
fun managerTabs() = arrayOf(HOME, BECOME_PARTNER, PROFILE)
fun unknownTabs() = arrayOf(PROFILE)
}
}
Altynbek Nurtaza
04/08/2021, 7:19 PMAltynbek Nurtaza
04/08/2021, 7:20 PMAltynbek Nurtaza
04/08/2021, 7:20 PMjim
04/08/2021, 7:22 PMAltynbek Nurtaza
04/08/2021, 7:22 PMval tabs = BottomNavTab.getTabs(role)
var tabIndex by rememberSaveable { mutableStateOf(0) }
...
tabs[tabIndex].content(navStates[tabIndex], hideNavBar)
Altynbek Nurtaza
04/08/2021, 7:23 PMAltynbek Nurtaza
04/08/2021, 7:23 PMAltynbek Nurtaza
04/08/2021, 7:23 PMAltynbek Nurtaza
04/08/2021, 7:24 PMAltynbek Nurtaza
04/08/2021, 7:26 PMval navStates = rememberSaveable {
mutableStateListOf(*tabs.map { Bundle() }.toTypedArray())
}
but it returns mutableStateList of regular itemsAltynbek Nurtaza
04/08/2021, 7:26 PMAltynbek Nurtaza
04/08/2021, 7:29 PMjim
04/08/2021, 7:29 PMList<MutableState<Item>>
is usually not the right thing. But aside from that, I still think you would be better served to have your state be a AppData
. It's fine if some of the users never use some of the fields on your AppData. For instance, if only a manager would ever use the BecomePartnerData
, etc. That field will just be empty for all other users.Altynbek Nurtaza
04/08/2021, 7:30 PMAltynbek Nurtaza
04/08/2021, 7:31 PMAltynbek Nurtaza
04/08/2021, 7:31 PMjim
04/08/2021, 7:31 PMAltynbek Nurtaza
04/08/2021, 7:32 PMAltynbek Nurtaza
04/08/2021, 7:32 PMjim
04/08/2021, 7:38 PMjim
04/08/2021, 7:39 PMIan Lake
04/08/2021, 8:05 PM