本次主要以kotlin实现,后续如果有人需要再更java版本的
kotlin实现
BaseViewModel部分:
//本次的baseviewmodel单传入一个context,需要其他参数的如法炮制就行
public open class BaseViewModel (var context: Context) : ViewModel() {
}
BaseViewModelProvider部分:
public class BaseViewModelProvider(private val fragment: BaseFragment) :
ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (BaseViewModel::class.java.isAssignableFrom(modelClass)) {
return modelClass.getConstructor(BaseFragment::class.java).newInstance(fragment)
}
return modelClass.newInstance()
}
}
NoSuchMethodException错误解决
如果做完上面的处理直接用,大概率会报这个错,解决方法是添加以下混淆代码到proguard-rules.pro
# ViewModel's empty constructor is considered to be unused by proguard
-keepclassmembers class * extends android.arch.lifecycle.ViewModel {
<init>(...);
}
如何引用
将原先的ViewModelProvider.NewInstanceFactory换自己的BaseViewModelProvider即可,示例代码
ViewModelProvider(requireParentFragment(), BaseViewModelProvider(this)).get(
{你的viewmodel}::class.java
)