Skip to content

Serializable error after upgrading from 1.10 to 2.0 #761

@jonneymendoza

Description

@jonneymendoza

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions