android 使用Hilt示例化带有运行时参数的viewModel

t30tvxxf  于 2023-03-28  发布在  Android
关注(0)|答案(2)|浏览(255)

我在做什么
我正在为我的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来传递参数,但我是匕首刀柄的新手,不知道如何实现这一点。如果有人能给予我一些指导,我将非常感激...谢谢。

kqlmhetl

kqlmhetl1#

您需要使用@Assisted注解authCode,并创建一个自定义的viewModelFactory。

kqhtkvqz

kqhtkvqz2#

只需使用自动生成ViewModel.savedStateHandler参数,该参数具有来自MainActivity的所有Intent参数

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

文件
抱歉,这是一个有点晚的答案,但可能是有用的任何人。

相关问题