Jetpack Compose 中的全局视图模型

问题描述 投票:0回答:1

我有一个问题。如何使用全局 ViewModel 实例,该实例可以由 Dagger/Hilt 作为共享实例注入到任何可组合项中?

我有 MainNavigationViewModel,它正在处理与导航栏相关的一些测量结果,我想在 NavHost 内的某些屏幕中共享这些测量结果。

所以我在 Activity 中初始化这个 ViewModel,如下所示:

@AndroidEntryPoint
class MainActivity : BaseActivity() {

    override val viewModel : MainNavigationViewModel by viewModels()

    override val screen: @Composable () -> Unit = {
        MainNavigation(viewModel = viewModel)
    }

}

在单独的可组合项中我只使用

@Composable
fun ScreenA(
    navigationViewModel: MainNavigationViewModel = hiltViewModel(),
)

然后使用

MutableState
 收集 
viewmodel.state.collectAsStateWithLifecycle()

但由于某种原因它返回错误的值(来自可变状态的默认值)。似乎每次我注入这个

ViewModel
时它都是不同的实例。我需要共享实例。

因此,如果 MainNavigation 将更新此 ViewModel 内的某些 MutableState 值,则定义此 ViewModel 的所有屏幕都将在需要时重新组合。

android android-jetpack-compose android-viewmodel dagger-hilt
1个回答
0
投票

要将注入的

ViewModel
范围限定到活动,请将活动提供为
viewModelStoreOwner
,例如:

fun Context.findActivity(): ComponentActivity? = when (this) {
    is ComponentActivity -> this
    is ContextWrapper -> baseContext.findActivity()
    else -> null
}

@Composable
fun ScreenA(
    navigationViewModel: MainNavigationViewModel = hiltViewModel(LocalContext.current.findActivity()!!),
)

    //Or

@Composable
fun ScreenA(
    navigationViewModel: MainNavigationViewModel = hiltViewModel(
        checkNotNull(LocalContext.current.findActivity()) { "No ViewModelStoreOwner found" }
    ),
)
© www.soinside.com 2019 - 2024. All rights reserved.