android 如何使用Hilt将ViewModel注入Activity?

bogh5gae  于 2022-12-16  发布在  Android
关注(0)|答案(2)|浏览(382)

我有一个ViewModel,我已经将它注入到了一个Composable中。现在我想将该ViewModel的 * 相同示例 * 注入到我的Activity中。
在帐户屏幕中.kt

@Composable
fun AccountScreen(accountViewModel: AccountViewModel = hiltViewModel()) {
    ...
}

和我的活动课:

class MainActivity : ComponentActivity() {
    @Inject
    lateinit var accountViewModel: AccountViewModel
}

应具有相同的AccountViewModel示例。
我知道在Activity中使用@Inject(如上面的示例)是行不通的。Hilt的文档建议使用ViewModelProviderby viewModels(),这两种方法都为我提供了一个新的AccountViewModel示例,但我需要与AccountScreen Composable中的示例相同的示例。

4dc9hkyq

4dc9hkyq1#

我假设AccountScreen是NavGraph的一部分,因为您提到需要视图模型的相同示例,所以可以考虑在AccountScreen中注入ViewModel时指定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)) {
                  ...
           }
        }

        ...
    }
}
bfnvny8b

bfnvny8b2#

我最终解决了这个问题,方法是在我的子Composable(在本例中为AccountScreen)中获取父Activity的ViewModel,如下所示:

val composeView = LocalView.current
val activityViewModel = composeView.findViewTreeViewModelStoreOwner()?.let {
    hiltViewModel<MyViewModel>(it)
}

在我的MainActivity中,我以标准方式获取ViewModel

private val accountViewModel: AccountViewModel by viewModels()

感谢@z.g.y提供了一个有用的建议,让我找到了这个解决方案。

相关问题