حقن التبعيات باستخدام Hilt
بسّطوا إدارة التبعيات باستخدام Hilt. استخدموا @HiltAndroidApp و@AndroidEntryPoint و@HiltViewModel و@Module و@Provides ونطاقات @Singleton.
حقن التبعيات باستخدام Hilt درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 6 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.
ما هو حقن الاعتماديات؟
يعني حقن الاعتماديات (DI) تزويد الكائن بما يحتاج إليه بدلًا من إنشاء الاعتماديات بنفسه.
من دون DI، تنشئ الفئة اعتمادياتها بنفسها، فتكون مرتبطة ارتباطًا وثيقًا ويصعب اختبارها. أما مع DI، فتُحقن الاعتماديات من الخارج، فتقل درجة الترابط ويصبح اختبارها واستبدالها سهلًا.
حقن الاعتماديات اليدوي مقابل Hilt
يعمل حقن الاعتماديات اليدوي، لكنه يصبح مرهقًا عند توسع التطبيق:
// Manual DI — you create and pass everything:
val db = AppDatabase.getInstance(context)
val dao = db.userDao()
val repo = UserRepository(dao)
val factory = UserViewModel.Factory(repo)
val viewModel = ViewModelProvider(this, factory)[UserViewModel::class.java]
// With Hilt:
// Just annotate, Hilt does the wiring
@HiltViewModel
class UserViewModel @Inject constructor(private val repo: UserRepository) : ViewModel()إضافة Hilt
أضف Hilt إلى مشروعك:
// project/build.gradle:
buildscript {
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
}
}
// app/build.gradle:
plugins {
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt'
}
dependencies {
implementation 'com.google.dagger:hilt-android:2.51'
kapt 'com.google.dagger:hilt-android-compiler:2.51'
}@HiltAndroidApp
أضف التعليق التوضيحي @HiltAndroidApp إلى فئة Application. هذه هي نقطة الدخول إلى بنية مكونات Hilt الهرمية:
@HiltAndroidApp
class MyApp : Application()
// Also register in AndroidManifest.xml:
// <application android:name=".MyApp" ...>@AndroidEntryPoint
أضف @AndroidEntryPoint إلى Activities وFragments وServices التي تحتاج إلى اعتماديات محقونة:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
analytics.logEvent("app_open")
}
}
@AndroidEntryPoint
class HomeFragment : Fragment() {
// Fragment's parent Activity must also be @AndroidEntryPoint
}@Inject — الحقن عبر المُنشئ
ضع التعليق التوضيحي @Inject على المُنشئ لإخبار Hilt بكيفية إنشاء الفئة. تحل Hilt جميع المعاملات تلقائيًا:
class UserRepository @Inject constructor(
private val userDao: UserDao,
private val apiService: ApiService
) {
suspend fun getUsers() = userDao.getAll()
suspend fun syncFromNetwork() {
val users = apiService.fetchUsers()
userDao.insertAll(users)
}
}
// Hilt sees UserRepository needs UserDao and ApiService,
// and automatically creates and injects them.@HiltViewModel
أضف التعليق التوضيحي @HiltViewModel إلى ViewModel واستخدم @Inject constructor. وفي Fragment، احصل عليه باستخدام by viewModels():
@HiltViewModel
class UserViewModel @Inject constructor(
private val repo: UserRepository
) : ViewModel() {
val users = repo.getUsersFlow().asLiveData()
}
// In Fragment:
@AndroidEntryPoint
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels() // Hilt provides it
}@Module و @Provides
عندما يتعذر على Hilt استخدام الحقن عبر المُنشئ (مثل الواجهات والفئات التابعة لجهات خارجية)، وفر المثيلات من خلال @Module:
@Module
@InstallIn(SingletonComponent::class) // lives for app lifetime
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}@Binds — ربط الواجهة
استخدم @Binds لإخبار Hilt بالتنفيذ الذي ينبغي استخدامه لواجهة:
interface AnalyticsService {
fun logEvent(name: String)
}
class FirebaseAnalytics @Inject constructor() : AnalyticsService {
override fun logEvent(name: String) { /* Firebase impl */ }
}
@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {
@Binds
@Singleton
abstract fun bindAnalytics(impl: FirebaseAnalytics): AnalyticsService
}نطاقات Hilt
تتحكم النطاقات في مدة بقاء المثيل المحقون:
@Singleton— مثيل واحد طوال فترة تشغيل التطبيق (ApplicationComponent)@ActivityRetainedScoped— يستمر عبر تغييرات الإعدادات@ActivityScoped— مثيل واحد لكل Activity@FragmentScoped— مثيل واحد لكل Fragment@ViewModelScoped— مثيل واحد لكل ViewModel
الاختبار باستخدام Hilt
استبدل الاعتماديات الحقيقية ببدائل وهمية في الاختبارات باستخدام دعم Hilt للاختبار:
@HiltAndroidTest
class UserRepositoryTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)
@Inject
lateinit var repo: UserRepository
@Before
fun setUp() {
hiltRule.inject()
}
@Test
fun usersAreFetched() {
assertNotNull(repo)
}
}تحقّق سريع
أي تعليق توضيحي يخبر Hilt بإنشاء بنية مكونات DI للتطبيق بأكمله؟
مراجعة: حقن الاعتماديات باستخدام Hilt
تجعل Hilt حقن الاعتماديات شبه تلقائي في Android:
@HiltAndroidAppعلى فئة Application@AndroidEntryPointعلى Activities وFragments@Inject constructorللفئات القابلة للحقن@HiltViewModel+@Inject constructorلـ ViewModels@Module+@Providesللفئات والواجهات التابعة لجهات خارجية@Singletonلمشاركة مثيل واحد على مستوى التطبيق
التالي: الإشعارات الفورية باستخدام Firebase Cloud Messaging.
الأسئلة الشائعة
هل درس «حقن التبعيات باستخدام Hilt» مجاني؟
نعم — نص درس «حقن التبعيات باستخدام Hilt» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.
ماذا ستتعلم في «حقن التبعيات باستخدام Hilt»؟
بسّطوا إدارة التبعيات باستخدام Hilt. استخدموا @HiltAndroidApp و@AndroidEntryPoint و@HiltViewModel و@Module و@Provides ونطاقات @Singleton. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 6 من أصل 6.
كم من الوقت يستغرق درس «حقن التبعيات باستخدام Hilt»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ViewModel وLiveData
- قاعدة بيانات Room
- Coroutines والدوال المعلّقة
- نمط Repository
- مكوّن Navigation
- حقن التبعيات باستخدام Hilt