मल्टी-मॉड्यूल ऐप्लिकेशन में हिलना

Hilt कोड जनरेट करने के लिए, Hilt का इस्तेमाल करने वाले सभी Gradle मॉड्यूल का ऐक्सेस होना ज़रूरी है. कॉन्टेंट बनाने Gradle मॉड्यूल, जो आपके Application क्लास में Hilt की सभी वैल्यू होनी चाहिए मॉड्यूल और कंस्ट्रक्टर-इंजेक्टेड क्लास का इस्तेमाल अपनी ट्रांज़िटिव डिपेंडेंसी में किया जा सकता है.

अगर आपका मल्टी-मॉड्यूल प्रोजेक्ट सामान्य Gradle मॉड्यूल से बना है, तो आप Hilt का इस्तेमाल करें. इसके बारे में डिपेंडेंसी इंजेक्शन' में बताया गया है: हिलना. हालांकि, यह ऐसे ऐप्लिकेशन जिनमें सुविधा है मॉड्यूल का इस्तेमाल करें.

फ़ीचर मॉड्यूल में नीचे जाएं

फ़ीचर मॉड्यूल में, मॉड्यूल के एक-दूसरे पर निर्भर होने का तरीका इन्वर्टेड है. इसलिए, Hilt, फ़ीचर मॉड्यूल में एनोटेशन प्रोसेस नहीं कर सकता. आपको ऐसा ज़रूर करना चाहिए कार्रवाई करने के लिए डैगर का इस्तेमाल करें आपके सुविधा मॉड्यूल में डिपेंडेंसी इंजेक्शन का इस्तेमाल करना.

फ़ीचर मॉड्यूल के साथ इस समस्या को हल करने के लिए, आपको कॉम्पोनेंट डिपेंडेंसी का इस्तेमाल करना होगा. फ़ॉलो करें यह तरीका अपनाएं:

  1. घोषणा करें @EntryPoint इंटरफ़ेस app मॉड्यूल में (या किसी अन्य मॉड्यूल में, जिसे Hilt की मदद से प्रोसेस किया जा सके) इन डिपेंडेंसी के हिसाब से, फ़ीचर मॉड्यूल की ज़रूरत होती है.
  2. @EntryPoint इंटरफ़ेस पर निर्भर डैगर कॉम्पोनेंट बनाएं.
  3. सुविधा मॉड्यूल में हमेशा की तरह डैगर का इस्तेमाल करें.

डिपेंडेंसी इंजेक्शन पेज को झुकाएं. मान लें कि आप अपने आपके प्रोजेक्ट में login फ़ीचर मॉड्यूल जोड़ा गया है. लॉगिन की सुविधा लागू करें LoginActivity नाम की गतिविधि के साथ. इसका मतलब है कि आपको बाइंडिंग मिल सकती हैं ऐप्लिकेशन कॉम्पोनेंट से ही किया जा सकता है.

इस सुविधा के लिए, आपको authInterceptor बाइंडिंग के साथ OkHttpClient की ज़रूरत होगी.

सबसे पहले, SingletonComponent में इंस्टॉल किया गया @EntryPoint इंटरफ़ेस बनाएं बाइंडिंग के साथ जिनकी 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 में फ़ील्ड इंजेक्शन चलाने के लिए, डैगर बनाएं जो @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();
  }
}

ये चरण पूरे होने के बाद, अपने फ़ीचर मॉड्यूल में हमेशा की तरह डैगर का इस्तेमाल करें. इसके लिए उदाहरण के लिए, 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;
  }
  ...
}

फ़ील्ड इंजेक्शन करने के लिए, डैगर कॉम्पोनेंट का इंस्टेंस बनाएं SingletonComponent डिपेंडेंसी पाने के लिए applicationContext का इस्तेमाल करना:

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);
    ...
  }
}

फ़ीचर मॉड्यूल में, मॉड्यूल डिपेंडेंसी के बारे में ज़्यादा जानकारी पाने के लिए, यहां देखें सुविधा के साथ कॉम्पोनेंट डिपेंडेंसी मॉड्यूल का इस्तेमाल करें.

Android पर डैगर के बारे में ज़्यादा जानकारी के लिए, Android में डैगर का इस्तेमाल करना देखें ऐप्लिकेशन हैं.