具有辅助注入和刀柄的共享 viewModel
Shared viewModel with assisted injection and hilt
我有一个 activity。此 activity 收到一些参数。
目前,我可以通过辅助注入使用这些参数创建 viewModel
。
//activity code
private val viewModel: ViewModel by viewModels {
val keyName = intent.extras?.getString(KEY_NAME).orEmpty()
ViewModel.provideFactory(keyName)
}
现在,我有一个 navHostFragment
,导航图中的所有片段都将使用我之前在 activity 中创建的视图模型。
但我找不到分享 viewModel
的方法
我已经知道我们可以使用 activityViewModels
与 activity
共享 viewModel
//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)....
所以,我的问题是...有没有办法在 activity 中创建一个带有辅助参数的 viewModel,并与片段共享该 viewModel?
With hilt 库现在支持以 SavedStateHandle
作为参数的视图模型,并且值会自动通过 SavedStateHandle
传递。您所要做的就是通过以下方式接收值
@HiltViewModel
class ViewModel @Inject constructor(
private val repository, savedStateHandle: SavedStateHandle
) : ViewModel() {
init {
// Use the same argName as in your navigation graph
val name : String = savedStateHandle["keyName"]
}
我有一个 activity。此 activity 收到一些参数。
目前,我可以通过辅助注入使用这些参数创建 viewModel
。
//activity code
private val viewModel: ViewModel by viewModels {
val keyName = intent.extras?.getString(KEY_NAME).orEmpty()
ViewModel.provideFactory(keyName)
}
现在,我有一个 navHostFragment
,导航图中的所有片段都将使用我之前在 activity 中创建的视图模型。
但我找不到分享 viewModel
我已经知道我们可以使用 activityViewModels
与 activity
//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)....
所以,我的问题是...有没有办法在 activity 中创建一个带有辅助参数的 viewModel,并与片段共享该 viewModel?
With hilt 库现在支持以 SavedStateHandle
作为参数的视图模型,并且值会自动通过 SavedStateHandle
传递。您所要做的就是通过以下方式接收值
@HiltViewModel
class ViewModel @Inject constructor(
private val repository, savedStateHandle: SavedStateHandle
) : ViewModel() {
init {
// Use the same argName as in your navigation graph
val name : String = savedStateHandle["keyName"]
}