Пользовательский полу-обобщенный Factory для ViewModels

Я пытаюсь создать обобщенный ViewModelProvider.Factory для создания экземпляров ViewModels

class BundledAppFactory(private var bundle: AppParameterBundle) : ViewModelProvider.NewInstanceFactory() { override fun <T : ViewModel> create(modelClass: Class<T>): T { Log.d("Factory", "Creating ${modelClass.canonicalName}") Log.d("Factory", "${modelClass.canonicalName} has ${modelClass.constructors.size} constructors and ${modelClass.declaredConstructors.size} declaredConstructors") modelClass.constructors.forEach { Log.d("Factory", "Constructor: $it") } return when { AppViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppParameterBundle::class.java).newInstance(bundle) AppTeamUserViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserParameterBundle::class.java).newInstance(bundle) AppTeamUserHuntIdViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserHuntIdParameterBundle::class.java).newInstance(bundle) AppStringViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppStringParameterBundle::class.java).newInstance(bundle) else -> super.create(modelClass) } } } 

Это мои связки:

 open class AppParameterBundle(val application: Application) class AppStringParameterBundle(app: Application, val string: String) : AppParameterBundle(app) class AppTeamUserParameterBundle(app: Application, val team: Team, val user: User) : AppParameterBundle(app) class AppTeamUserHuntIdParameterBundle(app: Application, val huntId: String, val team: Team, val user: User) : AppParameterBundle(app) 

И это базовые ViewModels, которые я расширяю с помощью пользовательских ViewModels:

 abstract class AppViewModel<MODEL, EVENT : Any>(bundle: AppParameterBundle) : BaseViewModel<MODEL, EVENT>(bundle) abstract class AppTeamUserViewModel<MODEL, EVENT : Any>(bundle: AppTeamUserParameterBundle) : BaseViewModel<MODEL, EVENT>(bundle) abstract class AppTeamUserHuntIdViewModel<MODEL, EVENT : Any>(bundle: AppTeamUserHuntIdParameterBundle) : BaseViewModel<MODEL, EVENT>(bundle) abstract class AppStringViewModel<MODEL, EVENT : Any>(bundle: AppStringParameterBundle) : BaseViewModel<MODEL, EVENT>(bundle) 

И пример ViewModel, который простирается от одного из них:

 class TeamViewModel(bundle: AppParameterBundle) : AppViewModel<TeamUiModel, TeamEvent>(bundle) { ... } 

Моя проблема в том, что

 modelClass.getDeclaredConstructor(AppParameterBundle::class.java).newInstance(bundle) 

не найдет никакого конструктора, и это строки

 Log.d("Factory", "${modelClass.canonicalName} has ${modelClass.constructors.size} constructors and ${modelClass.declaredConstructors.size} declaredConstructors") 

появляется в журналах

 mypackage.viewmodels.TeamViewModel has 0 constructors and 0 declaredConstructors 

Это то, что я получаю в stacktrace:

 Caused by: java.lang.NoSuchMethodException: <init> [class mypackage.ParameterBundle] at java.lang.Class.getConstructor(Class.java:528) at java.lang.Class.getDeclaredConstructor(Class.java:507) at mypackage.viewmodels.BundledAppFactory.create(FactoriesAndBundles.kt:39) at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128) at mypackage.TeamActivity.onCreate(TeamActivity.kt:41) 

Является ли это проблемой Котлина, что нет конструкторов? Как это исправить?

Это была проблема Proguard. Мне пришлось добавить эти строки в файл правил .pro

 -keep class mypackage.** { *; } -keepclassmembers public class mypackage.** { *; }