Как я могу создать ViewModel, содержащий объект DAO, в Dager 2?

#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);