You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Hilt中能否将一个ViewModel注入到另一个ViewModel中?

全局状态ViewModel的继承与状态修改实现

AppViewModel:全局状态容器

该类用于保存应用的全局状态,代码实现如下:

@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
    }
}

它通过Hilt实现依赖注入,暴露了isLoading可变状态用于控制全局加载状态,同时提供setIsLoading方法作为状态修改的入口。

ChildViewModel:子类修改全局状态

通过继承AppViewModel,子类可以直接操作基类维护的全局状态,比如在数据请求流程中更新加载状态以显示/隐藏进度条:

class ChildViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
): AppViewModel(savedStateHandle){

    ...

    fun onTriggerEvent(event: RestApiEvents) {
        try {
            viewModelScope.launch {
                // 更新AppViewModel中的加载状态为true
                isLoading.value = true
                when(event) {
                    is SearchEvent -> {
                        search(event.s)
                    }
                    else -> {
                        Log.d(TAG, "事件未匹配")
                    }
                }
                // 更新AppViewModel中的加载状态为false
                isLoading.value = false
            }
        }
        catch (e: Exception){
            e.printStackTrace()
        }
    }

    private suspend fun search(s: String) {
        ...
    }
}

在onTriggerEvent方法中,协程启动后先将isLoading设为true,执行对应的数据请求逻辑(如search方法),请求完成后再将isLoading设为false,以此实现全局加载状态的同步更新。

内容的提问来源于stack exchange,提问作者Matúš Ravas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:40:24