تكرار السؤال: …
الإجابة المختصرة
تربط النطاقات كائنات التبعيات بدورة حياة مكونات أندرويد المحددة: @Singleton للتطبيق بالكامل، @ActivityScoped للنشاط، و @ViewModelScoped لدورة حياة الـ ViewModel.
الشرح
إذا لم تحدد نطاقًا (Unscoped)، ينشئ Hilt نسخة جديدة من الكائن في كل مرة يُطلب فيها. تحديد @Singleton يضمن وجود نسخة واحدة فقط في التطبيق بالكامل داخل SingletonComponent. تحديد @ActivityScoped يضمن مشاركة نفس النسخة طوال بقاء الـ Activity، بينما يضمن @ViewModelScoped بقاء النسخة حية عبر Configuration Changes مع الـ ViewModel.
مثال بالكود
@Module
@InstallIn(ViewModelComponent::class)
object FeatureModule {
@Provides
@ViewModelScoped
fun provideFeatureState(): FeatureState = FeatureState()
}أخطاء شائعة
- استخدام @Singleton على كل شيء مما يستهلك الذاكرة دون مبرر ويبقي كائنات غير ضرورية حية طوال الوقت.
- محاولة حقن كائن معرف بنطاق ضيق (مثل @ActivityScoped) داخل كائن ذي نطاق أوسع (مثل @Singleton)، مما يسبب خطأ وقت الترجمة.