-
-
Notifications
You must be signed in to change notification settings - Fork 143
Open
Description
After migrating to version 2.0 of this library, whenever i navigate to a new screen from my navbar, i get the following error:
` E kotlinx.serialization.SerializationException: Serializer for class 'TvHomeScreenDestination' is not found. (Ask Gemini)
Please ensure that class is marked as '@serializable' and that the serialization compiler plugin is applied.
at kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered(Platform.common.kt:90)
at kotlinx.serialization.SerializersKt__SerializersKt.serializer(Serializers.kt:299)
at kotlinx.serialization.SerializersKt.serializer(Unknown Source:1)
at androidx.navigation.internal.NavControllerImpl.generateRouteFilled$navigation_runtime_release(NavControllerImpl.kt:1083)
at androidx.navigation.internal.NavControllerImpl.navigate$navigation_runtime_release(NavControllerImpl.kt:1570)
at androidx.navigation.NavController.navigate(NavController.android.kt:1028)
at androidx.navigation.NavController.navigate$default(NavController.android.kt:1021)
at com.me.movielistpractise.ui.components.NavigationBarKt.MovieNavigationBar$lambda$1$2$0(NavigationBar.kt:57)
at com.me.movielistpractise.ui.components.NavigationBarKt.$r8$lambda$mWOfsynduHAVQwK_vWlVuhLKLBM(Unknown Source:0)`
Here is where it breaks:
@composable
fun MainScreen() {
val navController: NavHostController = rememberNavHostEngine().rememberNavController()
val destinationNavigator = navController.rememberDestinationsNavigator()
var currentScreen = remember {
""
}
navController.addOnDestinationChangedListener { _, destination, _ ->
currentScreen = when {
destination.route?.contains(TopMovieListScreenDestination.route) == true -> TopMovieListScreenDestination.route
destination.route?.contains(MovieScreenDestination.route) == true -> MovieScreenDestination.route
else -> currentScreen // Keep currentScreen unchanged if no conditions are met
}
}
MovieListPractiseTheme {
Scaffold(topBar = {
MovieTopBar(currentScreen, navigator = navController)
}) { contentPadding ->
Column(modifier = Modifier.padding(contentPadding)) {
Box {
MovieNavigationBar(destinationNavigator)
}
Box {
DestinationsNavHost(navGraph = NavGraphs.root, navController = navController)
}
}
}
}
}
///////////////////////////////////////////////////
@Composable
fun MovieNavigationBar(destinationsNavigator: DestinationsNavigator) {
val currentSelected = remember {
mutableStateOf<Selected>(Selected.Home)
}
NavigationBar {
NavigationBarItem(
selected = currentSelected.value is Selected.TV,
onClick = {
currentSelected.value = Selected.TV
destinationsNavigator.navigate(TvHomeScreenDestination()) //crashes here
},
icon = {
Text(
text = stringResource(R.string.tv),
style = MaterialTheme.typography.labelMedium
)
})
}
This is the generated destinations for the TvHomeScreen
package com.ramcosta.composedestinations.generated.destinations
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.runtime.Composable
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import com.jon.movielistpractise.tv.ui.TvHomeScreen
import com.ramcosta.composedestinations.navigation.DependenciesContainerBuilder
import com.ramcosta.composedestinations.navigation.DestinationDependenciesContainer
import com.ramcosta.composedestinations.navigation.require
import com.ramcosta.composedestinations.scope.DestinationScope
import com.ramcosta.composedestinations.spec.*
/**
* Generated from [TvHomeScreen]
*/
public data object TvHomeScreenDestination : BaseRoute(), DirectionDestinationSpec {
public operator fun invoke(): Direction = this
override val baseRoute: String = "tv_home_screen"
override val route: String = baseRoute
@Composable
override fun DestinationScope<Unit>.Content() {
TvHomeScreen(
navigator = destinationsNavigator
)
}
}
The TVHomeScreen code
@Destination<RootGraph>
@Composable
fun TvHomeScreen(
navigator: DestinationsNavigator,
tvHomeScreenViewModel: TvHomeScreenViewModel = hiltViewModel()
) {
MovieListPractiseTheme {
val tvHomeScreenEvents = object : TvHomeScreenEvents {
override fun onTvShowClicked(tvShowId: Int) {
navigator.navigate(TvShowDetailScreenDestination(tvShowId = tvShowId))
}
}
when (val state = tvHomeScreenViewModel.state.collectAsState().value) {
is TvHomeScreenState.ContentRetrieved -> TvContentSection(
contentState = state,
tvHomeScreenEvents = tvHomeScreenEvents
)
is TvHomeScreenState.Error -> ErrorScreen(throwable = state.throwable)
TvHomeScreenState.Loading -> LoadingScreen()
}
}
}
And finally my depdendencies:
implementation("androidx.core:core-ktx:1.17.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
implementation("androidx.activity:activity-compose:1.11.0")
implementation(platform("androidx.compose:compose-bom:2025.09.01"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3-android:1.4.0")
implementation("androidx.compose.material:material-icons-core") // Version should be managed by BOM
implementation("androidx.compose.material:material-icons-extended") // Version should be managed by BOM
implementation("io.github.raamcosta.compose-destinations:core:2.2.0")
ksp("io.github.raamcosta.compose-destinations:ksp:2.2.0")
implementation("com.google.dagger:hilt-android:2.57.2")
ksp("com.google.dagger:hilt-android-compiler:2.57.2")
implementation("androidx.hilt:hilt-navigation-compose:1.3.0")
ksp("androidx.hilt:hilt-compiler:1.3.0")
implementation("com.squareup.retrofit2:retrofit:3.0.0")
implementation("com.squareup.retrofit2:converter-gson:3.0.0")
implementation("com.squareup.retrofit2:adapter-rxjava3:3.0.0")
implementation("io.reactivex.rxjava3:rxjava:3.1.12")
implementation("io.reactivex.rxjava3:rxandroid:3.0.2")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.4")
implementation("com.google.code.gson:gson:2.13.2")
implementation("io.reactivex.rxjava3:rxkotlin:3.0.1")
implementation("io.coil-kt:coil-compose:2.7.0")
Thanks in advanced
justinaskkk and MusfickBond
Metadata
Metadata
Assignees
Labels
No labels