Dagger2 + ViewModel + Репозиторий - PullRequest
0 голосов
/ 25 июня 2019

Я новичок в Dagger 2 и пытаюсь реализовать его в Kotlin. Здесь я пытаюсь ввести свой объект хранилища в viewmodel. Я успешно могу ввести его таким образом

public class LoginViewModel @Inject constructor(var mApplication: Application, var repository: LoginRepository) :
ViewModel() {

Вот так выглядит мой репозиторий

 class LoginRepository @Inject constructor(val retrofit: APICallInterface) {

Вот так выглядит мой модуль

@Module
class BaseModule {

@Provides
fun getRetrofit(): APICallInterface {

    return Retrofit.Builder()
        .baseUrl("https://samples.openweathermap.org/data/2.5/")
        .addConverterFactory(GsonConverterFactory.create())
        .build().create(APICallInterface::class.java)
}

Я не могу понять, как Dagger 2 может предоставить объект для хранилища, поскольку я не упомянул его ни в одном модуле с аннотацией @Provides.

Я пробовал следить за множеством блогов и несколькими доступными здесь вопросами stckoverflow, но ни один из них не решает мои сомнения.

Любая помощь / объяснение будет оценено.

1 Ответ

1 голос
/ 25 июня 2019

Я не могу понять, как Dagger 2 может предоставить объект для хранилища, поскольку я не упомянул его ни в одном модуле с аннотацией @Provides.

Выиспользование инжектора конструктора путем аннотирования конструктора с помощью @Inject:

[@Inject] Идентифицирует конструкторы, методы и поля для инъекций.

Таким образом, добавляя аннотацию, Dagger узнает о конструкторе и знает, как создать объект при необходимости.

 class LoginRepository @Inject constructor(..)

Если у вашего конструктора не будет аннотации , тогда вам понадобится аннотированный метод @Provides в модуле, чтобы Dagger мог получить доступ к зависимости, но вы должны использовать аннотированные методы @Provides в первую очередь для объектов, которые требуют дополнительной настройки и / или инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...