尝试在另一个 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
我试图从另一个 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