Jetpack Compose Navigation. Передача аргумента объект класса

Рейтинг: 2Ответов: 1Опубликовано: 18.03.2023

Можно ли как-то в навигации передать аргументом объект класса? Я пыталась сделать так, но ошибка в несоответствии типов в строчке получения аргумента

navController = rememberNavController()
            NavHost(navController = navController,
                startDestination = "schedule"
            ) {
                composable(
                    route = "schedule"
                ){
                    ScheduleScreen(navController)
                }
                composable(
                    route = "task"
                ){
                    TaskScreen(navController)
                }
                composable(
                    route = "taskinfo",
                    arguments = listOf(
                        navArgument("task"){
                            type = NavType.fromArgType("Task","com.example.example.Model")
                        }
                    )
                ){
                    val task: Task = Task(it.arguments?.getParcelable("task",Task))
                    TaskInfoScreen(navController, task)

                }
            }

Переход на другой экран

itemsIndexed(
            tasks
        ) { index, item ->
            Card(
                modifier = Modifier
                    .clickable {
                        navController.navigate("taskinfo/"+item)
                    }
                    .fillMaxWidth(),
                shape = RectangleShape
            ) {...}
          }

Класс Task

class Task(_name: String, _text: String, _subjects: String, _date: Calendar) {
    var name: String
    var text: String
    var subject: String
    var date: Calendar

    init {
        name = _name
        text = _text
        subject = _subjects
        date = _date
    }
}

Ответы

▲ 0

Вообще, не рекомендуется использовать Navigation Arguments для отправки чего-то по мимо примитивов. В вашем случае лучше хранить список объектов Task в ViewModel и передавать лишь уникальный id для получения конкретного Task вместо отправки объекта целиком.

Однако могу показать пример создания кастомного NavArgs:

@Parcelize
data class Task(
    val name: String,
    val text: String,
    val subjects: String,
    val date: Calendar
) : Parcelable

class TaskType : NavType<Task>(isNullableAllowed = false) {
    override fun get(bundle: Bundle, key: String): Task? {
        return bundle.getParcelable(key)
    }
    override fun parseValue(value: String): Task {
        return Gson().fromJson(value, Task::class.java)
    }
    override fun put(bundle: Bundle, key: String, value: Task) {
        bundle.putParcelable(key, value)
    }
}

И далее в вашей Compose функции:

NavHost(...) {
    ...
    composable(
        route = "taskinfo/{task}",
        arguments = listOf(navArgument("task"){ type = TaskType() })
    ){
        val task = it.arguments?.getParcelable<Task>("task")
        TaskInfoScreen(navController, task)
    }
}