إيقاف التطبيق في تطبيقات متعددة الوحدات

يحتاج إنشاء رمز Hilt إلى الوصول إلى جميع وحدات Gradle التي تستخدم Hilt. يجب أن تحتوي وحدة Gradle التي تجمِّع فئة Application على جميع وحدات Hilt والصفوف المضمَّنة في أدوات الإنشاء ضمن العناصر الاعتمادية الانتقالية.

إذا كان مشروعك المتعدّد الوحدات مؤلّفًا من وحدات عادية من نوع Gradle، يمكنك استخدام Hilt على النحو الموضّح في مقالة Credential inmention with Hilt. ومع ذلك، ليست هذه هي الحالة مع التطبيقات التي تتضمّن وحدات ميزات.

وحدات الميزات المضمّنة

في وحدات الميزات، يتم عكس الطريقة التي تعتمد بها الوحدات على بعضها البعض. وبالتالي، لا يمكن لـ Hilt معالجة التعليقات التوضيحية في وحدات الميزات. يجب استخدام Dagger لتنفيذ إضافة التبعية في وحدات الميزات.

يجب استخدام تبعيات المكونات لحل هذه المشكلة مع وحدات الميزات. اتبع هذه الخطوات:

  1. عرِّف واجهة @EntryPoint في وحدة app (أو في أي وحدة أخرى يمكن معالجتها من خلال Hilt) مع التبعيات التي تحتاجها وحدة الميزة.
  2. يمكنك إنشاء مكوِّن Dagger يعتمد على واجهة @EntryPoint.
  3. استخدِم 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.