我有一个 ViewModel
类:
@HiltViewModel
open class AppViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle
): ViewModel(){
val isLoading: MutableState<Boolean> = mutableStateOf(false)
fun setIsLoading(isLoading: Boolean){
this.isLoading.value = isLoading
}
}
此类应保存一般应用程序状态。
然后我有另一个 ViewModel
类,我希望能够在其中修改 AppViewModel
状态。例如。获取数据时,我想将 isLoading 设置为 true 并渲染进度条。
应修改 AppViewModel
状态的 ChildViewModel
类:
class ChildViewModel @Inject constructor(
private val repository: Repository,
private val savedStateHandle: SavedStateHandle
): AppViewModel(savedStateHandle){
...
fun onTriggerEvent(event: RestApiEvents) {
try {
viewModelScope.launch {
// this should change the state in AppViewModel
isLoading.value = true
when(event) {
is SearchEvent -> {
search(event.s)
}
else -> {
Log.d(TAG, "Event not found")
}
}
// this should change the state in AppViewModel
isLoading.value = false
}
}
catch (e: Exception){
e.printStackTrace()
}
}
private suspend fun search(s: String) {
...
}
}
最佳答案
所以,我是作曲新手,我试图做出完全相同的事情。 编译器不允许我将 AppViewModel 作为 ChildViewModel 的依赖项注入(inject),因此我最终执行了以下操作:
- 创建了一个数据类(AppStateHolder)来存储加载 boolean 值。
- 在 AppViewModel 中,我注入(inject) AppStateHolder 作为依赖项。
- 向 appmodule 添加了带有 @Singleton 和 @Provides 注释的 hilt 引用生成器。
- 我在 ChildViewModel 处注入(inject)对 AppStateHolder 的引用。
- AppStateHolder 的 isLoading boolean 值具有可变状态。
- 在 AppViewModel 初始化 block 中,我收集 appStateHolder 值并相应地更新可变状态。
- 必要时,我会在 ChildViewModel 中更新 AppStateHolder 值。
因此,您可以注入(inject) AppStateHolder,更新其值,当您执行此操作时,AppViewModel 将收到通知并更新其自己的状态。 缺点是,如果您在 AppViewModel 中有很多 ui 状态变量,则必须在 AppStateHolder 中复制它们,并始终在 AppViewModel 中观察它们。
我知道这不是最好的选择,但我会寻找其他方法,或者直到有人提出更好的解决方案。
关于java - 安卓刀柄。是否可以将一个 ViewModel 注入(inject)另一个 ViewModel 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73936795/