Недавно у меня возникла та же проблема, и я нашел generic ViewModelFactory
, это java, но ..
@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@NonNull
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Я бы поставил ссылку, но пока не смог ее найти ...
Редактировать:
@Singleton
@Component(modules={ActivityModule.class, FragmentModule.class, AppModule.class})
public interface AppComponents {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponents build();
}
void inject(Weather weatherApp);
}
Теперь, что вас интересует из класса выше, должно быть AppModule.class
@Module(includes = {UserModelModule.class /* other model modules */})
public class AppModule {
// --- DATABASE INJECTION ---
@Provides
@Singleton
YourDatabase provideDatabase(Application application) {
return Room.databaseBuilder(application,
YourDatabase.class, "YourDatabase.db")
//.allowMainThreadQueries() // do NOT DO THIS IN REAL APPLICATIONs
.fallbackToDestructiveMigration()
.build();
}
@Provides
@Singleton
UserDao provideUserDao(YourDatabase database) { return database.userDao(); }
.
.
// other Daos that you will have (the above is an example from [https://developer.android.com/jetpack/docs/guide]
Последнее, ядумаю, вы захотите увидеть, как выглядит класс ModelModule
@Module
public abstract class UserModelModule {
@Binds
@IntoMap
@ViewModelKey(UserViewModel.class)
abstract ViewModel bindUserProfileViewModel(UserViewModel repoViewModel);
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
}