问题描述
自定义Viewmodel ,传入 Factory时, 其实内部逻辑就是利用反射构造一个对象而已;但一直报NoSuchMethodException
异常;
factory如下;
class FragmentViewModelFactory(val fragment: Fragment) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (ObservableViewModel::class.java.isAssignableFrom(modelClass)) {
return modelClass.getConstructor(Fragment::class.java).newInstance(fragment)
}
return modelClass.newInstance()
}
}
问题解决
花了很多时间,查找原因无果,最后在 Stack Overflow 上看到 编辑混淆文件proguard-rules.pro
解决;
添加以下配置代码,即可;
## Android architecture components: Lifecycle
# LifecycleObserver's empty constructor is considered to be unused by proguard
-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver {
<init>(...);
}
# ViewModel's empty constructor is considered to be unused by proguard
-keepclassmembers class * extends android.arch.lifecycle.ViewModel {
<init>(...);
}
# keep Lifecycle State and Event enums values
-keepclassmembers class android.arch.lifecycle.Lifecycle$State { *; }
-keepclassmembers class android.arch.lifecycle.Lifecycle$Event { *; }
# keep methods annotated with @OnLifecycleEvent even if they seem to be unused
# (Mostly for LiveData.LifecycleBoundObserver.onStateChange(), but who knows)
-keepclassmembers class * {
@android.arch.lifecycle.OnLifecycleEvent *;
}