[英]How to inject ViewModel into Activity using Hilt?
我有一個 ViewModel,我已經將其注入到 Composable 中。 現在我想將該 ViewModel的相同實例注入到我的 Activity 中。 例如:
在 AccountScreen.kt
@Composable
fun AccountScreen(accountViewModel: AccountViewModel = hiltViewModel()) {
...
}
和我的活動課:
class MainActivity : ComponentActivity() {
@Inject
lateinit var accountViewModel: AccountViewModel
}
應具有相同的 AccountViewModel 實例。
我知道在 Activity 中使用@Inject
就像上面的例子一樣不起作用。 Hilt 的文檔建議改用ViewModelProvider
或by viewModels()
,這兩者都為我提供了一個新的 AccountViewModel 實例,但我需要與 AccountScreen Composable 中的實例相同的實例。
我假設AccountScreen
是 NavGraph 的一部分,因為您提到您需要視圖模型的相同實例,您可以考慮在將 ViewModel 注入AccountScreen
時指定 ViewModelStoreOwner ,因此MainActivity
和AccountScreen
將共享它的相同實例。
@Composable
fun MyNavHost(
...
) {
val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
}
NavHost(
modifier = modifier,
navController = navController,
startDestination = startDestination
) {
composable(<Destination>) {
AccountScreen(accountViewModel: AccountViewModel = hiltViewModel(viewModelStoreOwner)) {
...
}
}
...
}
}
我最終通過在我的子 Composable(在本例中為 AccountScreen)中獲取父 Activity 的 ViewModel 來解決這個問題,如下所示:
val composeView = LocalView.current
val activityViewModel = composeView.findViewTreeViewModelStoreOwner()?.let {
hiltViewModel<MyViewModel>(it)
}
在我的 MainActivity 中,我以標准方式獲取 ViewModel
private val accountViewModel: AccountViewModel by viewModels()
感謝@zgy 提供了一個有用的建議,使我找到了這個解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.