簡體   English   中英

如何使用 Hilt 將 ViewModel 注入 Activity?

[英]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 的文檔建議改用ViewModelProviderby viewModels() ,這兩者都為我提供了一個新的 AccountViewModel 實例,但我需要與 AccountScreen Composable 中的實例相同的實例。

我假設AccountScreen是 NavGraph 的一部分,因為您提到您需要視圖模型的相同實例,您可以考慮在將 ViewModel 注入AccountScreen時指定 ViewModelStoreOwner ,因此MainActivityAccountScreen將共享它的相同實例。

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM