В этом уроке подключаем Hilt к проекту и используем его для инджекта объектов 

 

На прошлом уроке мы на простом примере рассмотрели, как Hilt работает изнутри. Теперь давайте разберемся, как использовать Hilt в приложении.

В новом проекте сделаем пример того же самого приложения с двумя Activity (OrderActivity и UserActivity) и фрагментом (OrderFragment). Но теперь Hilt все свои классы будет создавать сам.

 

 

 

Подключение

В build.gradle файле проекта в секции dependencies добавляем Hilt зависимость:

classpath 'com.google.dagger:hilt-android-gradle-plugin:2.37'

 

В build.gradle файле модуля подключаем плагины kapt и Hilt в секции plugins:

id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'

 

а также Hilt зависимости в секции dependencies:

implementation 'com.google.dagger:hilt-android:2.37'
kapt 'com.google.dagger:hilt-compiler:2.37'

 

 

 

Application

Интеграцию Hilt в приложение начнем с App класса. Для этого просто помечаем наш App класс аннотацией HiltAndroidApp:

@HiltAndroidApp
class App: Application() {

}

Это все, что от нас требуется. А Hilt сделает все то, что мы делали на прошлом уроке: создаст AppComponent и специальный Hilt_App класс, который станет super классом для нашего App. При этом нам самим ничего наследовать не придется. Все будет сделано автоматически.

 

Мы просто добавляем в App переменные, которые нам нужны, и помечаем их аннотацией Inject.

@HiltAndroidApp
class App: Application() {

   @Inject lateinit var databaseHelper: DatabaseHelper

   override fun onCreate() {
       super.onCreate()
       Log.d(TAG, "databaseHelper = $databaseHelper")
   }

}

Инджект происходит под капотом.

 

 

 

Activity

Чтобы Hilt взял в работу наше Activity, его необходимо пометить аннотацией @AndroidEntryPoint:

@AndroidEntryPoint
class OrderActivity : AppCompatActivity() {

    @Inject
    lateinit var repository: OrderRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_order)

        Log.d(TAG, "repository = $repository")
    }
}

Hilt добавит в ActivityComponent инджект метод для этого Activity. А также создаст super класс для этого Activity, куда поместит весь даггер код. Нам самим явно ничего наследовать не надо. Мы только используем аннотацию Inject, чтобы попросить объекты у даггера.

 

 

 

AndroidEntryPoint

AndroidEntryPoint - универсальная аннотация, которой мы можем помечать Android сущности: Activity, фрагмент, сервис, View и Broadcast Receiver. Для Hilt - это сигнал, что он должен применить свою даггер-магию к этому объекту.

 

Добавим AndroidEntryPoint к UserActivity:

@AndroidEntryPoint
class UserActivity: AppCompatActivity() {

    @Inject
    lateinit var repository: UserRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        Log.d(TAG, "repository = $repository")
    }

}

 

и к OrderFragment:

@AndroidEntryPoint
class OrderFragment : Fragment() {

    @Inject
    lateinit var repository: OrderRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "fragment repository = $repository")
    }

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_order, container, false)
    }

}

 

Под капотом Hilt сделает все необходимое, и мы получаем возможность инджектить нужные нам объекты без лишнего кода.


Комментарии   

# BroadcastReceiverdev_course 01.12.2021 17:18
Стоит упомянуть отдельный ньюанс с BroadcastReceiver

Unlike the other supported Android classes, BroadcastReceivers do not have their own Dagger component and are instead simply injected from the SingletonComponent. ↩

https://dagger.dev/hilt/android-entry-point#fnref:1
# VS codeVadim 09.02.2022 15:21
аналогично есть нюанс с content provider
# RE: BroadcastReceiverЕвгений 03.05.2023 10:16
Список поддерживаемых аннотацией @AndroidEntryPoint компонентов по ссылке:
https://developer.android.com/training/dependency-injection/hilt-android#android-classes

Language

Автор сайта

Дмитрий Виноградов

Подробнее можно посмотреть или почитать.

Никакие другие люди не имеют к этому сайту никакого отношения и просто занимаются плагиатом.

Социальные сети

 

В канале я публикую ссылки на интересные и полезные статьи по Android

В чате можно обсудить вопросы и проблемы, возникающие при разработке



Группа ВКонтакте



Поддержка проекта

Яндекс
410011180491924

WebMoney
R248743991365
Z551306702056

Paypal