我有一个问题。如何使用全局 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 的所有屏幕都将在需要时重新组合。
要将注入的
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" }
),
)