Open3

【Android】実装メモ

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

ViewModelで、SavedHandleStateを受け取る

  • SavedStateHandleを経由してrouteから情報を受け取ることができる。
  • これはHiltの機能ではなく、ViewModelの機能である。
  • NavControllerのrouteで、リソースIDを受け取った場合などのケースで利用
TaskNavGraph.kt
@Composable
fun TodoNavGraph(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
) {
    NavHost(
        navController = navController,
        startDestination = "tasks",
        modifier = modifier
    ) {
        composable(
            "tasks"
        ) {
            TasksScreen(
                // TasksScreenにはタスクがリストに並び、そのリストの一つをタップすると
                // onTaskClickによってdetailに遷移する
                onTaskClick = { task -> navController.navigate("task/${task.id}") }
            )
        }
        composable(
            // ここのtaskIdをどのように次の画面で受け取るのか?が今回の実験
            "task/{taskId}"
        ) {
            TaskDetailScreen()
        }
    }
}
TaskDetailScreen.kt
@Composable
fun TaskDetailScreen(
    viewModel: TaskDetailViewModel = viewModel()
) {
    Text(text = "TaskDetailScreen")
}
TaskDetailViewModel.kt
class TaskDetailViewModel(
    savedStateHandle: SavedStateHandle
) : ViewModel() {
    val taskId: String = savedStateHandle["taskId"]!!
    init { Log.d("[Sample]", "taskId: $taskId") } // 出力: taskId: 077131ce-be04-4d4e-9362-230670011397
}