تولید کد Hilt نیاز به دسترسی به تمام ماژول های Gradle دارد که از Hilt استفاده می کنند. ماژول Gradle که کلاس Application
شما را کامپایل میکند، باید همه ماژولهای Hilt و کلاسهای تزریقشده توسط سازنده را در وابستگیهای متعدی خود داشته باشد.
اگر پروژه چند ماژول شما از ماژول های Gradle معمولی تشکیل شده است، می توانید از Hilt همانطور که در Dependency injection با Hilt توضیح داده شده است استفاده کنید. با این حال، این مورد در مورد برنامه هایی که شامل ماژول های ویژگی هستند صدق نمی کند.
انتخاب در ماژول های ویژگی
در ماژول های ویژگی، نحوه وابستگی ماژول ها به یکدیگر معکوس است. بنابراین، Hilt نمی تواند حاشیه نویسی را در ماژول های ویژگی پردازش کند. برای انجام تزریق وابستگی در ماژول های ویژگی خود باید از Dagger استفاده کنید.
برای حل این مشکل با ماژول های ویژگی باید از وابستگی های کامپوننت استفاده کنید. این مراحل را دنبال کنید:
- یک رابط کاربری
@EntryPoint
را در ماژولapp
(یا در هر ماژول دیگری که می تواند توسط Hilt پردازش شود) با وابستگی هایی که ماژول ویژگی به آن نیاز دارد، اعلام کنید. - یک مؤلفه Dagger ایجاد کنید که به رابط
@EntryPoint
بستگی دارد. - از Dagger به طور معمول در ماژول ویژگی استفاده کنید.
مثالی از صفحه Dependency injection with 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 مراجعه کنید.