如何将id和应用程序传递到Jetpack Compose中的viewModel/viewModelFactory ?&l



我使用Jetpack组合和导航组合,我想将id传递给这个viewmodel:

class RecallViewModel(private val id:Long,application: Application):AndroidViewModel(application) {
............................
}

可组合功能:

我不知道如何在可组合函数中获得application:

@Composable
fun RecallScreen(
id:Long,
onEnd:() -> Unit
){
val recallViewModel = viewModel(factory = RecallViewModelFactory(
id = id,application = "i don't know how to get application"))
}

和工厂

class RecallViewModelFactory(private val id:Long,val application: Application):ViewModelProvider.AndroidViewModelFactory(application) {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return RecallViewModel(id,application) as T
}
}

composable(
"${Routes.recall}/{id}",
arguments = listOf(navArgument("id") { type = NavType.LongType })
) {
RecallScreen(
id = it.arguments!!.getLong("id"),
onEnd = {navController.navigateUp()}
)
}

回答您的问题:您从LocalContext对象中检索Application:

val context = LocalContext.current
val application = context.applicationContext as Application

然而,当使用导航组合时,您不需要手动向ViewModel传递任何参数。相反,您可以利用ViewModels对SavedState的内置支持,并向ViewModel添加一个SavedStateHandle参数。SavedStateHandle是一个键/值映射,它会自动使用目标的参数填充。

这意味着你的ViewModel变成:

class RecallViewModel(
application: Application,
savedStateHandle: SavedStateHandle
):AndroidViewModel(application) {
// Get your argument from the SavedStateHandle
private val id: Long = savedStateHandle.get("id")
............................
}

并且您不再需要从参数中手动解析ID或将其传递给ViewModel:

composable(
"${Routes.recall}/{id}",
arguments = listOf(navArgument("id") { type = NavType.LongType })
) {
RecallScreen(
onEnd = {navController.navigateUp()}
)
}
@Composable
fun RecallScreen(
onEnd:() -> Unit
) {
val recallViewModel: RecallViewModel = viewModel()
}

最新更新