Jetpack Compose Navigation. Передача аргумента объект класса
Можно ли как-то в навигации передать аргументом объект класса? Я пыталась сделать так, но ошибка в несоответствии типов в строчке получения аргумента
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
}
}
Ответы (1 шт):
Автор решения: xephosbot
→ Ссылка
Вообще, не рекомендуется использовать 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)
}
}