具有辅助注入和刀柄的共享 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"]
        
    }