安卓希尔顿酒店,是否可以将一个ViewModel注入到另一个View模型中?

2hh7jdfx  于 2022-10-22  发布在  Java
关注(0)|答案(1)|浏览(170)

我有一个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) {
        ...
    }
}
ergxz8rk

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上观察它们。
我知道这不是最好的选择,但我会寻找其他方法,直到有人提出更好的解决方案。

相关问题