【发布时间】:2022-01-16 04:29:33
【问题描述】:
我有一个活动。此活动正在接收一些参数。
目前,我可以使用这些参数通过辅助注入创建一个viewModel。
//activity code
private val viewModel: ViewModel by viewModels {
val keyName = intent.extras?.getString(KEY_NAME).orEmpty()
ViewModel.provideFactory(keyName)
}
现在,我有一个navHostFragment,导航图中的所有片段都将使用我之前在活动中创建的视图模型。
但我找不到分享该视图模型的方法
我已经知道我们可以使用activityViewModels 与活动共享视图模型
//fragment code
private val sharedViewModel: ViewModel by activityViewModels()
但是我的sharedViewModel 没有没有辅助参数的构造函数(并且在运行时失败)。
目前,我有两个解决方案
第一个选项:在每个片段中“创建”一个新的 viewModel,并使用 activityViewModels 从 Activity(或 navArgs)接收参数以共享同一个实例(我不喜欢这种方法,但是作品)
private val viewModel: ViewModel by activityViewModels {
val keyName = navArgs.keyName
ViewModel.provideFactory(keyName)
}
第二个选项:从构造函数中移除辅助参数,并在viewModel中创建一个方法来设置我需要的信息:
@HiltViewModel
class ViewModel @Inject constructor(
private val repository,
.....
) : ViewModel() {
fun setKeyName(keyName: String)....
所以,我的问题是......有没有办法在活动中创建一个带有辅助参数的 viewModel,并与片段共享该 viewModel?
【问题讨论】:
-
所以你有一个负责从 Intent Extras 创建 ViewModel 的活动,并且你想让你的 Fragment 访问相同的 ViewModel(仍然使用 Intent Extras 作为键名)?或者您是否尝试将活动范围与仅发送到单个片段的参数混合在一起?
-
@ianhanniballake 我想与 navGraph 中的所有片段共享相同的视图模型。我的 viewModel 就像……一个 DetailsViewModel。因此,来自 viewModel 的一些基本信息将在所有片段中显示给用户(使用数据绑定),我正在 viewModel init 部分中检索信息
-
我认为您没有回答我的问题。论据从何而来?它们是否纯粹来自活动意图附加内容?
-
@ianhanniballake,是的,目前我的论点来自额外的意图
-
然后
by activityViewModels()(使用@HiltViewModel,没有自定义工厂)和SavedStateHandle,正如Amjad在他的回答中提到的那样,自动辅助注入参数。
标签: android viewmodel dagger-hilt assisted-inject