将 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
}