【问题标题】:Instantiate viewModel with run-time arguments using Hilt使用 Hilt 使用运行时参数实例化 viewModel
【发布时间】:2021-11-21 13:35:13
【问题描述】:

我在做什么

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

我在 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 从活动传递到 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 来传递参数,但我是匕首柄的新手,不知道如何实现这一点。 如果有人能给我一些指导,将不胜感激......谢谢。

【问题讨论】:

  • 直接从传递authCode 的活动中调用getAccessToken。这不适合你吗?
  • @ArpitShukla 感谢您的评论。嗯,是的,实际上我可以做到这一点,但只是想知道该方法是否可以在视图模型创建开始时执行,那么我不必在 Activity 的某个地方显式调用它。

标签: android kotlin viewmodel dagger-hilt


【解决方案1】:

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

【讨论】:

  • 谢谢! #Assisted Inject 部分正是我想要的 :)
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2021-04-18
  • 2022-12-14
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多