我目前正在将我的项目架构从MVP转换为MVVM。在进行此项工作时,我发现有些事情让我感到困惑:
在iosched项目的
在Sunshine项目中的
在iosched项目的
ScheduleViewModelFactory.kt
中,该工厂实现了ViewModelProvider.Factory。class ScheduleViewModelFactory(
private val userEventRepository:DefaultSessionAndUserEventRepository
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ScheduleViewModel::class.java)) {
return ScheduleViewModel(LoadUserSessionsByDayUseCase(userEventRepository)) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
在Sunshine项目中的
DetailViewModelFactory.java
文件中,工厂类继承了ViewModelProvider.NewInstanceFactory。该项目来自codelab教程。public class DetailViewModelFactory extends ViewModelProvider.NewInstanceFactory {
private final SunshineRepository mRepository;
private final Date mDate;
public DetailViewModelFactory(SunshineRepository repository, Date date) {
this.mRepository = repository;
this.mDate = date;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked
return (T) new DetailActivityViewModel(mRepository, mDate);
}
}
我想知道:
- ViewModelProvider.Factory和ViewModelProvider.NewInstanceFactory有什么区别?
- 为什么像上面代码中提到的那样使用它们?
- 在什么情况下使用它们是最佳实践/场景?
NewInstanceFactory
唯一的作用就是实现create()
方法。如果Google正在使用NewInstanceFactory
但又重写了create()
方法,他们本来就可以一开始就使用常规的Factory
。 - Steru