В этом уроке подключаем 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 сделает все необходимое, и мы получаем возможность инджектить нужные нам объекты без лишнего кода.
Комментарии
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
https://developer.android.com/training/dependency-injection/hilt-android#android-classes
RSS лента комментариев этой записи