【问题标题】:Why can i create ViewModel with instance为什么我可以使用实例创建 ViewModel
【发布时间】:2020-03-11 07:51:06
【问题描述】:

我在片段中使用 ViewModelProvider.Factory 创建 ViewModel。一切正常。

var reportViewModel = ViewModelProviders.of(this,ViewModelProvide(RemoteDataProviderImpl(
        WeakReference(context!!))))
       .get(ReportViewModel::class.java)

但是在我直接使用实例创建视图模型然后一切正常

var reportViewModel = ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))

很简单的ViewModel

class ReportViewModel(private var provider:RemoteDataProvider) : ViewModel(){
var posts = MutableLiveData<List<Report>>()
fun getPost(){
    provider.getComments().enqueue(object : Callback<ArrayList<Report>> {
        override fun onFailure(call: Call<ArrayList<Report>>, t: Throwable) {
            t.message
        }
        override fun onResponse(
            call: Call<ArrayList<Report>>,
            response: Response<ArrayList<Report>>
        ) {
            if (response.isSuccessful){
                val reports = response.body()
                posts.value = reports
                }
            }

        })
    }
}

这两个代码有什么区别。如果我可以直接创建 viewModel 为什么我需要 ViewModelProviders?

【问题讨论】:

    标签: android kotlin mvvm viewmodel android-jetpack


    【解决方案1】:

    使用ViewModelProviders 将允许Android 将ViewModel 附加到内部ViewModelStore。这将允许一些细节,例如在销毁活动或片段时调用onCleared 函数。另一个是视图模型对配置更改(例如方向)的限制。

    【讨论】:

      【解决方案2】:
       ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))
      

      • 创建视图模型的新引用没有活动或片段的任何范围

      • 将在活动的onCreate 中创建viewmodelnew reference。 (即使活动被旋转或配置被改变

      • 不会观察活动的范围,即即使活动是destroyed,它也会存在

        李>

      虽然

       ViewModelProvider.of(this).get(...)
      

      • Observe 活动的范围,即当 viewmodel 的 activity is finishedonCleared(..) 被调用时! (Viewmodel 会被销毁

      • 即使在configuration change 期间,Same instance of the viewmodel 也会persist

      【讨论】:

        【解决方案3】:

        因为当您更改配置(旋转手机)时, 如果你直接创建viewModel,viewModel会破坏并丢失viewModel中的所有数据。

        但是如果你使用ViewModelProvider创建viewModel,ViewModelProvider会保存viewModel实例和数据,所以配置改变时你不会丢失任何数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多