Использование Kotlin с Dagger

Как лучше всего использовать Dagger для внедрения зависимостей в классы, особенно классы конструктора с нулевым аргументом, такие как Activity, с помощью Dagger? Сможет ли Dagger 2 улучшить ситуацию?

Заранее спасибо.

4 ответа

Решение

После выпуска Kotlin M13 было специально добавлено новое свойство для поддержки внедрения зависимостей (как в Dagger 1 и 2) и других сред.

Это называется латинитная собственность. Взято из документации:

 class Example {
            @Inject
            lateinit var bar: Bar 
 }

В двух словах, bar не имеет инициализаторов, но объявлен как ненулевой тип. Если вы попытаетесь прочитать его перед инициализацией, выдается исключение.
В противном случае, после инициализации с помощью Dagger его можно использовать как обычное свойство.

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

Некоторое время я не обновлял свой ответ, и он устарел. Также заметил здесь новый ответ от @Ben, который работает для M13/M14.

Решил, что будет лучше, если я перенаправлю всех вас, заинтересованных в мой шаблонный проект, который я стараюсь держать в курсе последних версий Kotlin и Dagger 2. Котлин + Кинжал 2 образца

Я описываю там, как вводить объекты, в том числе несколько аннотаций и т. Д.

Dagger полагается на обработку аннотаций, которая, насколько я знаю, пока не поддерживается в Kotlin. Но они говорят, что это запланировано. И в то же время, вы можете либо расширить классы Java с помощью Dagger-зависимостей, либо попробовать какую-то основанную на отражении инфраструктуру внедрения - Guice, Roboguice

для использования аннотаций кинжала в Kotlin1- // кинжал добавить зависимости на уровне приложения

      implementation 'com.google.dagger:dagger:2.38.1'
kapt 'com.google.dagger:dagger-compiler:2.38.1'

добавить в уровень приложения / градиент

      plugins {
    id 'kotlin-kapt'
}

теперь вы можете использовать аннотации вроде @Inject @Component так далее

      class Test{
    @Inject
    lateinit var name: String
}
Другие вопросы по тегам