我在做什么
我正在为我的android应用实现oauth2进程。在用户通过浏览器授权应用后,我的应用将启动一个activity来从intent中检索授权代码,然后使用该代码获取API的访问令牌。
我在viewMomodel中有一个方法,注入了repository,以继续获取访问令牌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 bundle,是否仍然可以从savedStateHandle中获取数据?
如果没有,我认为另一种解决方案是创建一个自定义的ViewModelFactory来传递参数,但我是匕首刀柄的新手,不知道如何实现这一点。如果有人能给予我一些指导,我将非常感激...谢谢。
2条答案
按热度按时间kqlmhetl1#
您需要使用
@Assisted
注解authCode
,并创建一个自定义的viewModelFactory。kqhtkvqz2#
只需使用自动生成ViewModel.savedStateHandler参数,该参数具有来自MainActivity的所有Intent参数
文件
抱歉,这是一个有点晚的答案,但可能是有用的任何人。