使用 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
我在做什么
我正在对我的 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