تولید کد Hilt به دسترسی به همه پیمانههای Gradle که از Hilt استفاده میکنند نیاز دارد. ماژول Gradle که کلاس
Application شما را کامپایل میکند باید همه ماژولهای Hilt و کلاسهای تزریقشده سازنده را در وابستگیهای متعدی خود داشته باشد.
اگر پروژه چندماژولی شما از ماژولهای Gradle معمولی تشکیل شده است، میتوانید از Hilt همانطور که در تزریق وابستگی با Hilt توضیح داده شده است استفاده کنید. اما این موضوع درباره برنامههایی که شامل واحد ویژگی هستند صدق نمیکند.
Hilt در واحدهای ویژگی
در واحدهای ویژگی، نحوه وابستگی واحدها به یکدیگر معمولاً معکوس است. بنابراین، Hilt نمیتواند حاشیهنویسیها را در واحدهای ویژگی پردازش کند. باید از Dagger برای انجام تزریق وابستگی در واحدهای ویژگیتان استفاده کنید.
برای حل این مشکل با واحدهای ویژگی، باید از وابستگیهای مؤلفه استفاده کنید. این مراحل را دنبال کنید:
- یک
@EntryPointمیانای در واحدapp(یا در هر واحد دیگری که میتواند توسط Hilt پردازش شود) با وابستگیهایی که واحد ویژگی نیاز دارد، اعلام کنید. - یک مؤلفه Dagger ایجاد کنید که به واسط
@EntryPointوابسته باشد. - از Dagger مثل همیشه در واحد ویژگی استفاده کنید.
نمونه صفحه تزریق وابستگی با
Hilt را درنظر بگیرید. فرض کنید یک
واحد ویژگی login به پروژهتان اضافه میکنید. ویژگی ورود به سیستم را با فعالیتی بهنام LoginActivity پیادهسازی میکنید. این یعنی فقط از مؤلفه برنامه میتوانید
اتصالها را دریافت کنید.
برای این ویژگی، به OkHttpClient با اتصال authInterceptor نیاز دارید.
ابتدا، میانای @EntryPoint نصبشده در SingletonComponent را
با اتصالهایی که مدول login نیاز دارد ایجاد کنید:
کاتلین
// LoginModuleDependencies.kt - File in the app module. @EntryPoint @InstallIn(SingletonComponent::class) interface LoginModuleDependencies { @AuthInterceptorOkHttpClient fun okHttpClient(): OkHttpClient }
جاوا
// LoginModuleDependencies.java - File in the app module. @EntryPoint @InstallIn(SingletonComponent.class) public interface LoginModuleDependencies { @AuthInterceptorOkHttpClient OkHttpClient okHttpClient(); }
برای انجام تزریق فیلد در LoginActivity، یک مؤلفه Dagger ایجاد کنید که به میانای @EntryPoint وابسته باشد:
کاتلین
// 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 } }
جاوا
// 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 بهعنوان وابستگی کلاس استفاده کنید:
کاتلین
// LoginAnalyticsAdapter.kt - File in the login module. class LoginAnalyticsAdapter @Inject constructor( @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient ) { ... }
جاوا
// 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 را دریافت کنید:
کاتلین
// 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) ... } }
جاوا
// 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 مراجعه کنید.