כדי ליצור קוד Hilt נדרשת גישה לכל המודולים של Gradle שמשתמשים ב-Hilt.
מודול Gradle שמרכיבים את
בכיתה Application
צריכים להיות כל הפריטים של Hilt
של המודולים ושל המחלקות המוחדרות ל-constructor במסגרת יחסי התלות המעבריים שלהם.
אם הפרויקט מרובה המודולים מורכב ממודולים רגילים של Gradle, אתם יכולים השתמשו ב-Hilt כפי שמתואר בהחדרת תלות עם עילית. עם זאת, זו לא במקרה של אפליקציות שכוללות את התכונה מודולים.
מודולים של פיצ'רים
במודולים של תכונות, האופן שבו המודולים בדרך כלל תלויים זה בזה הוא הפוך. לכן, Hilt לא יכול לעבד הערות במודולים של תכונות. צריך משתמשים ב-Dagger כדי לבצע החדרת תלות במודולים של התכונות.
כדי לפתור את הבעיה הזו במודולים של מאפיינים, צריך להשתמש ביחסי תלות של רכיבים. הוספה למעקב את השלבים הבאים:
- להצהיר על
הממשק
@EntryPoint
במודולapp
(או בכל מודול אחר שניתן לעבד על ידי Hilt) ביחסי התלות שדרושים למודול התכונה. - יוצרים רכיב Dagger שתלוי בממשק של
@EntryPoint
. - משתמשים ב-Dagger כרגיל במודול התכונה.
ניקח לדוגמה את הדוגמה מהחדרת תלות עם
עמוד. נניח שהוספת
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
, צריך ליצור צלבון
רכיב שתלוי בממשק @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. של Google.