يحتاج إنشاء رمز Hilt إلى الوصول إلى جميع وحدات Gradle التي تستخدم Hilt. يجب أن تحتوي وحدة
Gradle التي تجمِّع فئة
Application
على جميع وحدات Hilt
والصفوف المضمَّنة في أدوات الإنشاء ضمن العناصر الاعتمادية الانتقالية.
إذا كان مشروعك المتعدّد الوحدات مؤلّفًا من وحدات عادية من نوع Gradle، يمكنك استخدام Hilt على النحو الموضّح في مقالة Credential inmention with Hilt. ومع ذلك، ليست هذه هي الحالة مع التطبيقات التي تتضمّن وحدات ميزات.
وحدات الميزات المضمّنة
في وحدات الميزات، يتم عكس الطريقة التي تعتمد بها الوحدات على بعضها البعض. وبالتالي، لا يمكن لـ Hilt معالجة التعليقات التوضيحية في وحدات الميزات. يجب استخدام Dagger لتنفيذ إضافة التبعية في وحدات الميزات.
يجب استخدام تبعيات المكونات لحل هذه المشكلة مع وحدات الميزات. اتبع هذه الخطوات:
- عرِّف
واجهة
@EntryPoint
في وحدةapp
(أو في أي وحدة أخرى يمكن معالجتها من خلال Hilt) مع التبعيات التي تحتاجها وحدة الميزة. - يمكنك إنشاء مكوِّن Dagger يعتمد على واجهة
@EntryPoint
. - استخدِم Dagger كالمعتاد في وحدة الميزات.
فكّر في مثال من صفحة حقن التبعية باستخدام
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.