0

我有一个活动。此活动正在接收一些参数。目前,我可以viewModel使用这些参数通过辅助注入创建一个。

//activity code
private val viewModel: ViewModel by viewModels {   
    val keyName = intent.extras?.getString(KEY_NAME).orEmpty()
    ViewModel.provideFactory(keyName)
}

现在,我有一个navHostFragment导航图中的所有片段都将使用我之前在活动中创建的视图模型。但我找不到分享该 viewModel 的方法

我已经知道我们可以用来activityViewModels与活动共享 viewModel

//fragment code
private val sharedViewModel: ViewModel by activityViewModels()

但是我sharedViewModel没有没有辅助参数的构造函数(并且在运行时失败)。

目前,我有两个解决方案

第一个选项:在每个片段中“创建”一个新的 viewModel,并使用 activityViewModels 从活动(或 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)....

所以,我的问题是......有没有办法在活动中创建一个带有辅助参数的视图模型,并与片段共享该视图模型?

4

1 回答 1

2

使用 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"]
        
    }
于 2022-01-16T04:43:55.660 回答