Подход, который команда Google предложила в примерах компонентов архитектуры, заключается в использовании пользовательской аннотации для предоставления классов ViewModel через кинжал.
В Java аннотация выглядит следующим образом.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import androidx.lifecycle.ViewModel;
import dagger.MapKey;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@MapKey
@interface ViewModelKey {
Class<? extends ViewModel> value();
}
При этом используется MapKey из Dagger, где любая аннотированная ViewModel будет скомпонована в Map, которую затем можно будет использовать в ViewModelFactory.
В примерах Google ViewModelFactory выглядит следующим образом, где при использовании инжектора конструктора выможет получить доступ к карте провайдеров ViewModel.
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModels;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModels) {
this.viewModels = viewModels;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<ViewModel> viewModelProvider = viewModels.get(modelClass);
if (viewModelProvider == null) {
throw new IllegalArgumentException("model class " + modelClass + " not found");
}
//noinspection unchecked
return (T) viewModelProvider.get();
}
}
В вашем примере вы получите следующее для предоставления MyCatchViewModel.Другие ViewModels можно затем предоставить, следуя тому же шаблону.
@Module
public abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MyCatchViewModel.class)
abstract ViewModel myCatchViewModel(MyCatchViewModel myCatchViewModel);
}
Для полного примера вы можете посмотреть пример GithubBrowserSample от Google.https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/di/ViewModelModule.kt