我有一个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
状态。E、 g.当获取数据时,我想将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) {
...
}
}
1条答案
按热度按时间ergxz8rk1#
所以,我是新来作曲的,我试图做出完全相同的东西。编译器不允许我将AppViewModel作为对ChildViewModel的依赖注入,因此我最终做了以下操作:
1.创建了一个数据类(AppStateHolder)来存储加载bool值。
1.在AppViewModel中,我注入AppStateHolder作为依赖项。
1.向appmodule添加了带有@Singleton和@Provides注解的柄引用生成器。
1.我在ChildViewModel处注入对AppStateHolder的引用。
1.AppStateHolder对于isLoading布尔值具有可变状态。
1.在AppViewModel初始化块,我收集appStateHolder值并相应地更新可变状态。
1.必要时,在ChildViewModel I中更新AppStateHolder值。
因此,您可以注入AppStateHolder,更新其值,当您这样做时,AppViewModel将收到通知并更新其自身状态。挫折是,如果你在AppViewModel上有很多ui状态变量,你必须在AppStateHolder上复制它们,并始终在AppViewModel上观察它们。
我知道这不是最好的选择,但我会寻找其他方法,直到有人提出更好的解决方案。