使用 Hilt 用 运行 时间参数实例化 viewModel

Instantiate viewModel with run-time arguments using Hilt

我在做什么

我正在对我的 android 应用实施 oauth2 流程。用户通过浏览器授权应用程序后,我的应用程序将启动一个 activity 以从意图中检索授权代码,然后使用该代码获取 APIs 的访问令牌。

我在 viewMomodel 中有一个方法,其中注入了存储库,以继续获取访问令牌 API:

@HiltViewModel
class MainActivityViewModel @Inject constructor(
    private val repository: AuthRepository
) : ViewModel() {


fun getAccessToken(authCode: String) {
...
}
...
}

获取 activity 中的 viewModel:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    private val viewModel : MainActivityViewModel by viewModels()
...
}

在activity中,可以这样获取授权码:

//retrive code from intent
val authCode = intent.data.getQueryParameter("code")

问题

我的问题是,如何将 authCode 从 activity 传递到 viewModel 并从 viewModel 的 init 块调用 getAccessToken 函数?

@HiltViewModel
class MainActivityViewModel @Inject constructor(
    private val repository: AuthRepository,
    private val authCode: String //how to pass this parameter?
) : ViewModel() {

init {
   //Want to call getAccessToken here
   getAccessToken(authCode)
}
fun getAccessToken(authCode: String) {
...
}
...
}

我已经阅读了这篇精彩的文章 https://medium.com/mobile-app-development-publication/passing-intent-data-to-viewmodel-711d72db20ad 并了解到 savedStateHandle 可以提供 Intent 数据的键值对。但在我的情况下,authCode 存储在 intent.data 而不是 intent.extras 包中,是否仍然可以从 savedStateHandle 获取数据?

如果不是,我认为另一种解决方案是创建自定义 ViewModelFactory 来传递参数,但我是匕首柄的新手,不确定如何实现这一点。 如果有人能给我一些指导,我将不胜感激...谢谢。

您需要用 @Assisted 注释 authCode 并创建自定义 viewModelFactory。你可以在这里找到更多相关信息 https://proandroiddev.com/whats-new-in-hilt-and-dagger-2-31-c46b7abbc64a