【问题标题】:Trying to use ViewModels inside of another ViewModel, Errors with LifecycleObserver and Ownership (Kotlin)尝试在另一个 ViewModel 中使用 ViewModel,LifecycleObserver 和所有权错误 (Kotlin)
【发布时间】:2021-01-12 01:01:42
【问题描述】:

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

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 时遇到了问题,但是 扩展 类到 LifecycleObserver 修复了它,我不知道这是否会起作用,但我唯一正确的错误现在它是 .observe(this,....) 的所有者,我似乎没有找到将生命周期所有者从 fragment 传递到此视图模型的方法。我需要使这个视图模型工作的所有变量都在这两个响应中。如果这是一个非常糟糕的方法,请告诉我。感谢阅读。

【问题讨论】:

  • 我不认为将 ViewModel 放在另一个视图模型中是个好主意

标签: kotlin retrofit2 viewmodel


【解决方案1】:

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

我建议你在 Activity/Fragment 中创建 View Models 的实例,然后从 Activity/ViewModel 的相应方法/strong>Fragment.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多