java - 安卓刀柄。是否可以将一个 ViewModel 注入(inject)另一个 ViewModel 中?

标签 java android kotlin dependency-injection dagger-hilt

我有一个 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),因此我最终执行了以下操作:

  1. 创建了一个数据类(AppStateHolder)来存储加载 boolean 值。
  2. 在 AppViewModel 中,我注入(inject) AppStateHolder 作为依赖项。
  3. 向 appmodule 添加了带有 @Singleton 和 @Provides 注释的 hilt 引用生成器。
  4. 我在 ChildViewModel 处注入(inject)对 AppStateHolder 的引用。
  5. AppStateHolder 的 isLoading boolean 值具有可变状态。
  6. 在 AppViewModel 初始化 block 中,我收集 appStateHolder 值并相应地更新可变状态。
  7. 必要时,我会在 ChildViewModel 中更新 AppStateHolder 值。

因此,您可以注入(inject) AppStateHolder,更新其值,当您执行此操作时,AppViewModel 将收到通知并更新其自己的状态。 缺点是,如果您在 AppViewModel 中有很多 ui 状态变量,则必须在 AppStateHolder 中复制它们,并始终在 AppViewModel 中观察它们。

我知道这不是最好的选择,但我会寻找其他方法,或者直到有人提出更好的解决方案。

关于java - 安卓刀柄。是否可以将一个 ViewModel 注入(inject)另一个 ViewModel 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73936795/

相关文章:

java - JShell - 防止 Enter 键执行 Java 语句或如何设置语句分隔符

android - MotionLayout onSwipe 自动完成速度

kotlin - 一起运行时,测试会失败,但是单独运行会成功,即使在每次测试之前重新模拟实例

android-studio - 用于使用 gradle (1.1.2-5) 构建的 kotlin 版本与捆绑到 IDE 插件 (1.1.2-4) 中的版本不同

kotlin - Kotlin继续进行 map 操作

java - 实现不同步读取的双缓冲java HashMap

java通过索引访问hashmap内部数组

android - flutter 错误 : RangeError (index): Invalid value: Not in range 0. .2,包括:3

音乐播放器的 JavaFX tableView 播放按钮?

android - 尝试添加新矢量 Assets 时无法生成预览