إنّ عملية إنشاء رموز Hilt تحتاج إلى الوصول إلى جميع وحدات Gradle التي تستخدم Hilt. تشير رسالة الأشكال البيانية
وحدة Gradle التي تجمع
يجب أن يضم الصف Application
كل Hilt
والوحدات الأساسية والفئات التي تم حقنها في الدالة الإنشائية في تبعياتها المتبادلة.
إذا كان مشروعك متعدد الوحدات يتكون من وحدات Gradle العادية، فيمكنك عندها استخدام Hilt كما هو موضح في إدخال التبعية مع Hilt. ومع ذلك، فإن هذا ليس حالة التطبيقات التي تتضمّن ميزة الوحدات.
تضمين وحدات الميزات
في وحدات الميزات، تكون الطريقة التي تعتمد عادةً بها الوحدات على بعضها مقلوبة. لذلك، لا يمكن لأداة Hilt معالجة التعليقات التوضيحية في وحدات الميزات. يجب استخدِم Dagger لإجراء إدخال التبعية في وحدات الميزات.
يجب استخدام تبعيات المكونات لحل هذه المشكلة في وحدات الميزات. متابعة الخطوات التالية:
- إضافة بيان
واجهة
@EntryPoint
في وحدةapp
(أو في أي وحدة أخرى يمكن معالجتها باستخدام Hilt) مع التبعيات التي تحتاجها وحدة الميزة. - يمكنك إنشاء مكوّن Dagger استنادًا إلى واجهة
@EntryPoint
. - يمكنك استخدام أداة Dagger كالمعتاد في وحدة الميزات.
ضع في الاعتبار المثال من Dependency injection with
Hilt. لنفترض أنك أضفت
login
. تنفيذ ميزة تسجيل الدخول
مع نشاط يسمى LoginActivity
. هذا يعني أنه يمكنك الحصول على عمليات ربط
من مكون التطبيق فقط.
لتفعيل هذه الميزة، ستحتاج إلى OkHttpClient
مع ربط authInterceptor
.
أولاً، عليك إنشاء واجهة @EntryPoint
مثبَّتة في SingletonComponent
بالارتباطات التي تحتاجها وحدة login
:
Kotlin
// LoginModuleDependencies.kt - File in the app module. @EntryPoint @InstallIn(SingletonComponent::class) interface LoginModuleDependencies { @AuthInterceptorOkHttpClient fun okHttpClient(): OkHttpClient }
Java
// LoginModuleDependencies.java - File in the app module. @EntryPoint @InstallIn(SingletonComponent.class) public interface LoginModuleDependencies { @AuthInterceptorOkHttpClient OkHttpClient okHttpClient(); }
لتنفيذ حقن الحقل في LoginActivity
، يجب إنشاء Dagger
يعتمد على واجهة @EntryPoint
:
Kotlin
// LoginComponent.kt - File in the login module. @Component(dependencies = [LoginModuleDependencies::class]) interface LoginComponent { fun inject(activity: LoginActivity) @Component.Builder interface Builder { fun context(@BindsInstance context: Context): Builder fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder fun build(): LoginComponent } }
Java
// LoginComponent.java - File in the login module. @Component(dependencies = LoginModuleDependencies.class) public interface LoginComponent { void inject(LoginActivity loginActivity); @Component.Builder interface Builder { Builder context(@BindsInstance Context context); Builder appDependencies(LoginModuleDependencies loginModuleDependencies); LoginComponent build(); } }
بعد اكتمال هذه الخطوات، استخدِم Dagger كالمعتاد في وحدة الميزات. بالنسبة
على سبيل المثال، يمكنك استخدام الروابط من SingletonComponent
باعتبارها
تبعية فئة ما:
Kotlin
// LoginAnalyticsAdapter.kt - File in the login module. class LoginAnalyticsAdapter @Inject constructor( @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient ) { ... }
Java
// LoginAnalyticsAdapter.java - File in the login module. public class LoginAnalyticsAdapter { private final OkHttpClient okHttpClient; @Inject LoginAnalyticsAdapter( @AuthInterceptorOkHttpClient OkHttpClient okHttpClient ) { this.okHttpClient = okHttpClient; } ... }
لتنفيذ حقن الحقل، أنشئ مثيلاً لمكوِّن Dagger
استخدام applicationContext
للحصول على اعتماديات SingletonComponent
:
Kotlin
// LoginActivity.kt - File in the login module. class LoginActivity : AppCompatActivity() { @Inject lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter override fun onCreate(savedInstanceState: Bundle?) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( applicationContext, LoginModuleDependencies::class.java ) ) .build() .inject(this) super.onCreate(savedInstanceState) ... } }
Java
// LoginActivity.java - File in the login module. public class LoginActivity extends AppCompatActivity { @Inject LoginAnalyticsAdapter loginAnalyticsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( getApplicationContext(), LoginModuleDependencies.class ) ) .build() .inject(this); super.onCreate(savedInstanceState); ... } }
لمزيد من المعلومات حول تبعيات الوحدات في وحدات الميزات، يمكنك مراجعة تبعيات المكونات مع الميزة الوحدات.
للحصول على مزيد من المعلومات حول أداة Dagger على Android، يمكنك الاطّلاع على استخدام أداة Dagger في Android. التطبيقات.