【发布时间】: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