استخدام Dagger Hilt في تطبيقات Android
كيف تستخدمون dagger-hilt لتحسين سير العمل عند تطوير تطبيقات Android

أفترض في هذا المقال أن القارئ يملك فهمًا جيدًا لأساسيات kotlin وdagger وdagger-android.
الوضع الحالي مع Dependency Injection
إن كنتم تعملون في تطوير Android منذ فترة، فالأرجح أنكم استخدمتم أدوات مثل dagger وdagger-android للتعامل مع حقن التبعيات (dependency injection) في تطبيقاتكم. وأنا واثق أننا جميعًا نعرف جيدًا حجم الكود الذي نكتبه لإعداد التبعيات. فغالبًا ما اضطررتم إلى إنشاء واجهة ApplicationComponent، وعدة dagger modules للـ activities وfragments، ومع ذلك احتجتم إلى ربط factories حتى تتمكنوا من حقن الـ view models. ولا تنتهي المتاعب هنا، إذ عليكم تكرار هذه الخطوات كلها من جديد لإجراء أي integration testing ذي قيمة. من الواضح أن مكتبة dagger-android قد تبدأ في التحول إلى عبء.
لماذا Hilt؟
تعالج مكتبة dagger-hilt تقريبًا جميع المشكلات المذكورة أعلاه. وهذه بعض مزايا استخدام hilt:
- كود boilerplate أقل
- فصل اعتماديات البناء (build dependencies)
- إعداد أبسط
- اختبارات أفضل
- مكوّنات موحّدة (standardized components)
لمعرفة المزيد عن مزايا Hilt، اطلعوا على Why Hilt على Dagger Dev
كفى كلامًا، أرونا الكود
لاستخدام Hilt، أضيفوا اعتماديات البناء التالية إلى ملف build.gradle الخاص بـ Android Gradle module:
apply plugin: 'dagger.hilt.android.plugin'
dependencies {
implementation 'com.google.dagger:hilt-android:<VERSION>'
kapt 'com.google.dagger:hilt-android-compiler:<VERSION>'
// For instrumentation tests
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.28-alpha'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
// For local unit tests
testImplementation 'com.google.dagger:hilt-android-testing:2.28-alpha'
kaptTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
}
kapt {
correctErrorTypes true
}
أضيفوا ما يلي إلى ملف build.gradle الخاص بالمشروع
buildscript {
repositories {
<em>// other repositories...</em>
mavenCentral()
}
dependencies {
<em>// other plugins...</em>
classpath 'com.google.dagger:hilt-android-gradle-plugin:<version>'
}
}
تطبيق Hilt يجب أن يحتوي كل تطبيق يستخدم Hilt على فئة Application موسومة بـ @HiltAndroidApp. تُطلق @HiltAndroidApp عملية توليد الكود لـ Hilt components، وتولّد أيضًا فئة أساسية لتطبيقكم تستخدم هذه المكوّنات المولّدة
@HiltAndroidApp
public final class MyApplication extends Application {}
لتفعيل حقن الأعضاء (members injection) في الـ activity، ضعوا على الفئة الوسم @AndroidEntryPoint.
@AndroidEntryPoint
public final class MainActivity extends MyBaseActivity {
@Inject Foo foo; <em>// Bindings in SingletonComponent or ActivityComponent</em>
@Override
public void onCreate() {
<em>// Injection happens in super.onCreate().</em>
super.onCreate();
<em>// Do something with foo ...</em>
}
}
استخدام Hilt مع ViewModels
يتضمن Hilt امتدادات لتوفير فئات من مكتبات Jetpack الأخرى. ويدعم Hilt حاليًا مكوّنات Jetpack التالية: ViewModels وWorkManager أضيفوا ما يلي إلى app/build.gradle
dependencies {
...
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
}
وفّروا الـ ViewModel باستخدام الوسم @ViewModelInject في constructor كائن ViewModel. ويجب أيضًا وسم الاعتمادية SavedStateHandle بـ @Assisted:
class ExampleViewModel @ViewModelInject constructor(
private val repository: ExampleRepository,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
...
}
بعد ذلك، يمكن لأي activity أو fragment موسوم بـ @AndroidEntryPoint الحصول على نسخة الـ ViewModel كالمعتاد باستخدام ViewModelProvider أو by viewModels()
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
private val exampleViewModel: ExampleViewModel by viewModels()
...
}
Hilt Modules
الـ Hilt modules هي Dagger modules عادية مع وسم إضافي هو @InstallIn، يحدد Hilt component(s) التي سيُثبَّت فيها الـ module.
@Module
@InstallIn(SingletonComponent.class) <em>// Installs FooModule in the generate SingletonComponent.</em>
public final class FooModule {
@Provides
static Foo provideFoo() {...}
}
رائع! أصبحتم جاهزين لبدء استخدام hilt في تطبيق Android الخاص بكم. شخصيًا، وجدت تطبيق Hilt سهلًا مقارنة بـ dagger. وإن شعرتم بالشيء نفسه بعد تجربة ما سبق، فجرّبوه في مشروعكم القادم.


