尝试在另一个 ViewModel 中使用 ViewModel,LifecycleObserver 和所有权错误 (Kotlin)

Trying to use ViewModels inside of another ViewModel, Errors with LifecycleObserver and Ownership (Kotlin)

我试图从另一个 ViewModel 中的其他 ViewModel 中获取一些数据以使我的代码更小,但是我在尝试实现已经在片段或 activity 中工作的内容时遇到了问题,这就是我得到了:

class ObraConMediaViewModel(private val context: ViewModelStoreOwner,
                        private val id: Int): ViewModel(), LifecycleObserver {

var allObras: LiveData<ArrayList<ObraConMedia>>

private lateinit var viewModelobras: ViewModelObras
private lateinit var viewModelMediaObra: ViewModelMediaObra

val repositoryobras =ObrasRepository()
val repositoryMediaObra = MediaObraRepository()

val viewModelFactoryobras = ViewModelFactoryObras(repositoryobras)
val viewModelMediaObraFactory = ViewModelMedIaObraFactory(repositoryMediaObra)

init{
    viewModelobras = ViewModelProvider(context, viewModelFactoryobras)
        .get(ViewModelObras::class.java) // requireActivity() when called
    viewModelMediaObra = ViewModelProvider(context, viewModelMediaObraFactory)
        .get(ViewModelMediaObra::class.java)

    viewModelobras.getObras(id)
    viewModelobras.myResponse.observe(this , Observer { response ->
        if (response.isSuccessful){
            Log.d("Response", response.body()?.ans?.get(0)?.autor)
            Log.d("Response", response.body()?.ans?.get(1)?.autor)
        }else{
            Log.d("Response", response.errorBody().toString())
        }})

    viewModelMediaObra.getMediaObra(Constantes.PRUEBA_ID)
    viewModelMediaObra.myResponse.observe(this, Observer { response ->
        if (response.isSuccessful){
            Log.d("Response", response.body()?.ans?.get(0)?.filePath)

        }
    })
}}

我在使用 Observer 时遇到了问题,但是 将 class 扩展 class 到 LifecycleObserver 修复了它,我不知道是否这甚至可以工作,但我现在唯一的错误是 .observe(this,....) 的所有者,我似乎找不到通过生命周期所有者的方法从 片段 到此视图模型。我需要使这个视图模型工作的所有变量都在这两个响应中。如果这是一种非常糟糕的方法,请告诉我。感谢阅读。

请注意,上述方法是不正确的。
不应在另一个 ViewModel.
中创建 ViewModel 的实例 有可能一个 ViewModel 会先于另一个被摧毁。这将导致垃圾引用和内存泄漏。

我建议您在 Activity/Fragment 中创建两个 View Models 的实例,然后调用 ViewModel 来自 Activity/Fragment.

另外,由于你想让你的代码更小更简洁,我强烈推荐你Shared ViewModel
这个Shared ViewModel可以被两个片段使用
请参考这个link