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

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

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

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

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

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

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