Типобезопасный Kotlin DSL NavGraph выдает исключение IllegalStateException

Я играю с новым плагином Kotlin DSL Navigation Compose, но получаю исключение:

java.lang.IllegalStateException: невозможно найти startDestination com.perissf.myapp.SignIn из NavGraph. Убедитесь, что начальный NavDestination был добавлен с маршрутом из KClass.

Сборный

NavHost(
    navController = navController,
    startDestination = SignIn,
) {
    // if I remove the following lines calling NavGraphBuilder.composable() extension function, I get the exception
    composable<SignIn> {  
        SignInScreen()
    }
    signInDestination()        
}

ВойтиNavigation.kt

@Serializable
object SignIn

fun NavGraphBuilder.signInDestination () {
    composable<SignIn> {
        SignInScreen()
    }
}

Странно то, что если я удалю вызов функции расширения NavGraphBuilder.composable, как подробно описано в комментарии к коду, я получу исключение; если я оставлю его, он будет работать нормально, но в конечном итоге он должен делать то же самое, что и вызов функции расширения signInDestination(), написанной мной.

Используя передовую библиотеку androidx.navigation:navigation-compose:2.8.0-beta04@aar и следуя построчно этому руководству для разработчиков Android: Инкапсулируйте свой навигационный код

Вы используете один и тот же импорт composable в обоих файлах?

ianhanniballake 03.07.2024 22:13

@ianhanniballake конечно: androidx.navigation.compose.composable в обоих файлах

perissf 03.07.2024 22:25

А если метод signInDestination() находится в том же файле, что и ваш NavHost, он все равно не работает?

ianhanniballake 03.07.2024 22:28

@ianhanniballake ваша подсказка привела меня в правильном направлении: действительно, перемещая расширение в новый файл, я ошибочно оставил @Serializable object SignIn в обоих местах и ​​импортировал не то. Теперь все работает нормально. Спасибо!!!

perissf 03.07.2024 22:38
2
4
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщение об ошибке указывает, что конкретный класс, который вы используете при вводе startDestination = SignIn, отсутствует в графе навигации, т. е. не существует ни одного composable<SignIn>, использующего тот же самый SignIn объект.

Убедитесь, что вы ссылаетесь на один и тот же объект, проверив импорт в своих файлах. Хорошая проверка — переместить метод расширения в тот же файл и посмотреть, работает ли это, а затем повторить попытку в новом месте.

Другие вопросы по теме