Skip to content

Instantly share code, notes, and snippets.

@AndroidPoet
Created April 17, 2026 17:28
Show Gist options
  • Select an option

  • Save AndroidPoet/d40a89b1c634f3a3d610e268f3812f3e to your computer and use it in GitHub Desktop.

Select an option

Save AndroidPoet/d40a89b1c634f3a3d610e268f3812f3e to your computer and use it in GitHub Desktop.
sealed class TabRoute {
data object Home : TabRoute()
data object Explore : TabRoute()
data object Messages : TabRoute()
data object Profile : TabRoute()
}
sealed class HomeStackRoute {
data object Feed : HomeStackRoute()
data class PostDetail(val postId: String) : HomeStackRoute()
data class UserProfile(val userId: String) : HomeStackRoute()
}
sealed class ExploreStackRoute {
data object Trending : ExploreStackRoute()
data class SearchResults(val query: String) : ExploreStackRoute()
}
@Composable
fun MainTabNavigation() {
var selectedTab by remember { mutableStateOf<TabRoute>(TabRoute.Home) }
val tabNavControllers = remember {
mapOf(
TabRoute.Home to NavController(HomeStackRoute.Feed),
TabRoute.Explore to NavController(ExploreStackRoute.Trending),
TabRoute.Messages to NavController(Route.Messages),
TabRoute.Profile to NavController(Route.Profile)
)
}
Scaffold(
bottomBar = {
NavigationBar {
listOf(
TabRoute.Home,
TabRoute.Explore,
TabRoute.Messages,
TabRoute.Profile
).forEach { tab ->
NavigationBarItem(
icon = { Icon(tab.getIcon(), contentDescription = null) },
label = { Text(tab.getTitle()) },
selected = selectedTab == tab,
onClick = {
if (selectedTab != tab) {
selectedTab = tab
}
}
)
}
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
when (selectedTab) {
TabRoute.Home -> HomeTabNavHost(tabNavControllers[TabRoute.Home]!!)
TabRoute.Explore -> ExploreTabNavHost(tabNavControllers[TabRoute.Explore]!!)
TabRoute.Messages -> MessagesScreen()
TabRoute.Profile -> ProfileScreen()
}
}
}
}
@Composable
private fun HomeTabNavHost(navController: NavController) {
NavHost(navController, HomeStackRoute.Feed) {
composable<HomeStackRoute.Feed> {
FeedScreen(navController)
}
composable<HomeStackRoute.PostDetail> { entry ->
val postId = (entry.toRoute() as HomeStackRoute.PostDetail).postId
PostDetailScreen(postId, navController)
}
composable<HomeStackRoute.UserProfile> { entry ->
val userId = (entry.toRoute() as HomeStackRoute.UserProfile).userId
UserProfileScreen(userId, navController)
}
}
}
@Composable
private fun ExploreTabNavHost(navController: NavController) {
NavHost(navController, ExploreStackRoute.Trending) {
composable<ExploreStackRoute.Trending> {
TrendingScreen(navController)
}
composable<ExploreStackRoute.SearchResults> { entry ->
val query = (entry.toRoute() as ExploreStackRoute.SearchResults).query
SearchResultsScreen(query, navController)
}
}
}
@Composable
fun FeedScreen(navController: NavController) {
var posts by remember { mutableStateOf<List<Post>>(emptyList()) }
LaunchedEffect(Unit) {
// Load posts from API
}
LazyColumn {
items(posts) { post ->
PostCard(
post = post,
onPostClick = {
navController.navigate(HomeStackRoute.PostDetail(post.id))
},
onUserClick = {
navController.navigate(HomeStackRoute.UserProfile(post.userId))
}
)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment