将 viewModel 注入 @Composable
Inject viewModel to @Composable
我的 ProfileScreen 有 viewModel。
@Composable
fun ProfileScreen() {
val viewModel: ProfileViewModel = viewModel()
...
}
每次调用 ProfileScreen 时,都会创建新的 viewModel。我如何才能为我的 ProfileScreen 创建一个 viewModel 实例。我尝试在 https://insert-koin.io/docs/reference/koin-android/compose/ 之后注入 viewModel 但是当我尝试
验证视图模型:ProfileViewModel = viewModel()
Android Studio 抛出错误。
只要您销毁可组合项,您的 viewModel
就会被销毁,它可以在 重新组合 后继续存在,但一旦您的可组合项被销毁,它就会被销毁。
您可以做的是在比 ProfileScreen 可组合项寿命更长的范围内创建 viewModel
,然后将 viewModel
作为参数传递给它。
像这样的东西应该有用。
@Composable
fun MainScreen() {
val vModel : ProfileViewModel = viewModel()
....
ProfileScreen(vModel)
}
或使用 remember()
在重构调用之间保存实例 ViewModel
@Composable
fun ProfileScreen() {
val viewModel = remember { ProfileViewModel() }
...
}
此外,rememberSaveable 允许在 activity
的重新创建之间保存状态(又名数据 class)
如果您想使用 Koin 将您的视图模型注入可组合项,您应该遵循文档中的描述。
getViewModel() - fetch instance
通过调用该方法,Koin 将搜索该视图模型并提供一个实例。
这是在我的应用程序中注入视图模型的示例。
fun ManualControlScreen(
onDrawerClick: () -> Unit,
viewModel: ManualControlViewModel = getViewModel<ManualControlViewModel>()
) {
// Your composable UI
}
我的 ProfileScreen 有 viewModel。
@Composable
fun ProfileScreen() {
val viewModel: ProfileViewModel = viewModel()
...
}
每次调用 ProfileScreen 时,都会创建新的 viewModel。我如何才能为我的 ProfileScreen 创建一个 viewModel 实例。我尝试在 https://insert-koin.io/docs/reference/koin-android/compose/ 之后注入 viewModel 但是当我尝试
验证视图模型:ProfileViewModel = viewModel()
Android Studio 抛出错误。
只要您销毁可组合项,您的 viewModel
就会被销毁,它可以在 重新组合 后继续存在,但一旦您的可组合项被销毁,它就会被销毁。
您可以做的是在比 ProfileScreen 可组合项寿命更长的范围内创建 viewModel
,然后将 viewModel
作为参数传递给它。
像这样的东西应该有用。
@Composable
fun MainScreen() {
val vModel : ProfileViewModel = viewModel()
....
ProfileScreen(vModel)
}
或使用 remember()
在重构调用之间保存实例 ViewModel
@Composable
fun ProfileScreen() {
val viewModel = remember { ProfileViewModel() }
...
}
此外,rememberSaveable 允许在 activity
的重新创建之间保存状态(又名数据 class)如果您想使用 Koin 将您的视图模型注入可组合项,您应该遵循文档中的描述。
getViewModel() - fetch instance
通过调用该方法,Koin 将搜索该视图模型并提供一个实例。
这是在我的应用程序中注入视图模型的示例。
fun ManualControlScreen(
onDrawerClick: () -> Unit,
viewModel: ManualControlViewModel = getViewModel<ManualControlViewModel>()
) {
// Your composable UI
}