#java #android #mvvm #dagger-2
#java #Android #mvvm #dagger-2
Вопрос:
Я создаю ViewModel Android в Activity:
EventViewModel model = ViewModelProviders.of(this).get(EventViewModel.class);
Для этого я создаю EventViewModel
:
public class EventViewModel extends ViewModel {
private final EventDao eventDao;
public EventViewModel(EventDao eventDao) {
this.eventDao = eventDao;
}
public void createEvent(final Event event) {
new Thread(new Runnable() {
@Override
public void run() {
eventDao.insert(event);
}
}).start();
}
}
Я узнал, что я должен создать пользовательскую фабрику, чтобы внедрить мою EventDao
в EventViewModel
. Хорошо, допустим, я это сделал.
public class ViewModelFactory implements ViewModelProvider.Factory {
private final EventDao eventDao;
@Inject
public ViewModelFactory(EventDao eventDao) {
this.eventDao = eventDao;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass == EventViewModel.class) {
return (T) new EventViewModel(eventDao);
}
return null;
}
}
но что делать дальше? Я вижу несколько способов. Если верить примерам из Google, я должен выполнить next в MyActivity:
EventViewModel model = ViewModelProviders.of(this, new ModelFactory(eventDao)).get(EventViewModel.class);
1) Но куда мне попасть eventDao
в MyActivity?
2) Нужно ли мне создавать пользовательские ModelFactory
для каждого ViewModel
, если в нем используется класс dao?
Я использую Dagger 2
и я просто хочу понять, как я могу создать ViewModel
с DAO и использовать это ViewModel
в MyActivity?
Комментарии:
1. Вы можете создать
DatabaseModule
класс и предоставить dao из этого класса. Итак, вам просто нужно @ввести Dao в свою активность2. Пожалуйста, добавьте код для вашего компонента, с помощью которого вы пытаетесь настроить
@Inject
Ответ №1:
Вы вводите ViewModelFactory в действие. ViewModelFactory получит EventDao посредством внедрения конструктора. Вы передаете введенный экземпляр ViewModelFactory, скажем, ViewModelFactory, ViewModelProviders
EventViewModel model = ViewModelProviders.of(this, viewModelFactory).get(EventViewModel.class);