izyaboi
11/02/2020, 10:49 AMNavHost(navController, startDestination = NavigationScreen.Home.route) {
composable(NavigationScreen.Home.route) { Home(navController) }
composable(NavigationScreen.Playlist.route) { Playlist() }
composable(Screen.Detail.route) { DetailScreen()}
}
navigation works but not like i implement it as second activity with start activity.loloof64
11/02/2020, 11:09 AMizyaboi
11/02/2020, 11:12 AMloloof64
11/02/2020, 11:14 AMizyaboi
11/02/2020, 11:18 AM@Composable
fun MainScreen() {
val items = listOf(
NavigationScreen.Home,
NavigationScreen.Playlist,
)
val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigation (
modifier = Modifier.navigationBarsPadding(left = false, right = false)
){
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)
items.forEach { screen ->
val selected = currentRoute == screen.route
BottomNavigationItem(
icon = {
when {
selected -> Icon(screen.selectedIcon)
else -> Icon (screen.icon)
}
},
label = { Text(stringResource(screen.resourceId)) },
selected = selected,
onClick = {
// This is the equivalent to popUpTo the start destination
navController.popBackStack(
navController.graph.startDestination,
false
)
// This if check gives us a "singleTop" behavior where we do not create a
// second instance of the composable if we are already on that destination
if (currentRoute != screen.route) {
navController.navigate(screen.route)
}
}
)
}
}
}
) {
NavHost(navController, startDestination = NavigationScreen.Home.route) {
composable(NavigationScreen.Home.route) { Home(navController) }
composable(NavigationScreen.Playlist.route) { Playlist() }
composable(Screen.Detail.route) { DetailScreen(navController)}
}
}
}
izyaboi
11/02/2020, 11:21 AMziv kesten
11/02/2020, 12:08 PMziv kesten
11/02/2020, 12:11 PMziv kesten
11/02/2020, 12:11 PMTrackShowsApp implementation
@Composable
fun TrackShowsApp(viewModel: MainViewModel) {
val navController = rememberNavController()
navigationConfigurations(navController, viewModel, initialScreen = AppScreens.Main.route) // Declare the navigation flows
handleNavigationActions(viewModel, navController) // Act on navigation actions flow
}
@ExperimentalCoroutinesApi
@FlowPreview
@ExperimentalAnimationApi
@Composable
private fun navigationConfigurations(
navController: NavHostController,
viewModel: MainViewModel,
initialScreen: String,
) {
NavHost(navController, startDestination = initialScreen) {
composable(AppScreens.Main.route) {
MainScreen(viewModel)
}
composable(AppScreens.Details.route) {
ShowDetails(viewModel)
}
composable(AppScreens.Search.route) {
SearchScreen(viewModel)
}
}
}
@ExperimentalCoroutinesApi
@FlowPreview
@Composable
private fun handleNavigationActions(viewModel: MainViewModel, navController: NavHostController) {
CoroutineScope(Dispatchers.Main).launch {
viewModel.navigateTo.collect {
navController.navigate(it.route)
}
}
}
ziv kesten
11/02/2020, 12:13 PM@Composable
fun MainScreen(viewModel: MainViewModel) {
val navController = rememberNavController()
val bottomNavigationItems = listOf(
BottomNavigationScreens.WatchList,
BottomNavigationScreens.MyShows,
BottomNavigationScreens.Discover,
BottomNavigationScreens.Statistics
)
Scaffold(
topBar = { TrackShowsTopBar() },
bottomBar = { TrackShowsBottomNavigation(navController, bottomNavigationItems) },
floatingActionButton = { TrackShowsFloatingActionButton(navController) },
floatingActionButtonPosition = FabPosition.End
) {
MainScreenNavigationConfigurations(navController, viewModel)
}
}
@ExperimentalCoroutinesApi
@FlowPreview
@ExperimentalAnimationApi
@Composable
private fun MainScreenNavigationConfigurations(
navController: NavHostController,
viewModel: MainViewModel
) {
NavHost(navController, startDestination = BottomNavigationScreens.WatchList.route) {
composable(BottomNavigationScreens.WatchList.route) {
WatchList(viewModel)
CustomView()
}
composable(BottomNavigationScreens.MyShows.route) {
MyShows(viewModel = viewModel)
}
composable(BottomNavigationScreens.Discover.route) {
DiscoverScreen(viewModel)
}
composable(BottomNavigationScreens.Statistics.route) {
WatchList(viewModel)
}
}
}
ziv kesten
11/02/2020, 12:13 PM@Composable
private fun TrackShowsBottomNavigation(
navController: NavHostController,
items: List<BottomNavigationScreens>
) {
BottomNavigation {
val currentRoute = currentRoute(navController)
items.forEach { screen ->
BottomNavigationItem(
icon = {
when (screen) {
is BottomNavigationScreens.WatchList -> Icon(Icons.Filled.Terrain)
is BottomNavigationScreens.MyShows -> Icon(Icons.Filled.Satellite)
is BottomNavigationScreens.Discover -> Icon(Icons.Filled.LocalSee)
is BottomNavigationScreens.Statistics -> Icon(Icons.Filled.ChargingStation)
}
},
label = { Text(stringResource(id = screen.resourceId)) },
selected = currentRoute == screen.route,
alwaysShowLabels = false,
onClick = {
// This if check gives us a "singleTop" behavior where we do not create a
// second instance of the composable if we are already on that destination
if (currentRoute != screen.route) {
Log.d("Zivi", "navigate to: ${screen.route}")
navController.navigate(screen.route)
}
}
)
}
}
}
@Composable
private fun currentRoute(
navController: NavHostController
): String? {
val navBackStackEntry by navController.currentBackStackEntryAsState()
return navBackStackEntry?.arguments?.getString(KEY_ROUTE)
}