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
相关产品推荐
相关产品推荐

