为什么我可以使用实例创建视图模型



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

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

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

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

它是简单的视图模型

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
}
}
})
}
}

这两个代码有什么区别。如果我可以直接创建视图模型,为什么我需要视图模型提供者?

ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))

创建
  • 视图模型的新引用,而不创建任何活动或片段的范围。

  • 将在活动onCreate创建viewmodelnew reference。(即使活动被轮换或配置被更改)

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

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

  • Observe活动的范围,即当视图模型的activity is finishedonCleared(..)被调用时!(视图模型将被销毁)

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

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

因为当您更改配置(旋转电话)时, 如果直接使用 创建视图模型,视图模型将销毁并丢失视图模型中的所有数据。

但是,如果您使用ViewModelProvider创建 viewModel,ViewModelProvider将保存 viewModel 实例和数据,因此在配置更改时不会丢失任何数据。

相关内容

  • 没有找到相关文章

最新更新