کاری که ما در ادامه میخوایم انجام بدیم اینه که به یک Activity یک سری چیز میز یا همون dependency تزریق کنیم ، توی مقاله قبل گفتیم که هر Component یک سری Module داره ، پس ما اینجا یک Module جدید به اسم AppModule درست میکنیم ، وظیفه اون ایجاد یک سری وابستگی های کلیه ، توی مثالی که میزنیم قراره یک سری وابستگی های مربوط به کتاب خونه Glide (برای تصاویر) رو برامون ایجاد کنه (چون اینجا در مورد توضیحات Glide نیست خیلی واردش نمیشم ولی بذارید کلیتش رو بگم ، provider اول برای خودِ module استفاده میشه که میاد مشخص میکنه وقتی در حالت loading و error باشیم چه عکسی رو نشون بدیم ، خروجی provider اول به provider دوم میره و قسمت ابتدایی Glide رو برای ما تولید میکنه (این خودِ سینتکسِ Glide هست و توضیح خاصی نداره ، application هم از طریق component اصلی داره فراهم میشه) در نهایت هم یک فایل Drawable برای اینکه خودِ عکس چی باشه provide میشه) .
@Module class AppModule { @Provides fun requestOptions() : RequestOptions { return RequestOptions .placeholderOf(R.drawable.loading) .error(R.drawable.error) } @Provides fun provideGlideInstance(application: Application,requestOptions: RequestOptions) : RequestManager { return Glide.with(application).setDefaultRequestOptions(requestOptions) } @Provides fun provideAppDrawble(application: Application) : Drawable { return ContextCompat.getDrawable(application,R.drawable.logo)!! } }
با عبارت Module (@ مخففِ annotation هست) مشخص میکنیم این یک کلاس از جنس Module هستش (منظورم از جنس این نیست که ارث برده باشه ، خیلی به معنی لغوی کلمات توجه نکنید) ، با استفاده از عبارت Provide میتونیم توابعی رو مشخص کنیم که برامون یک سری Dependency رو تهیه یا provide میکنند و بعدا قراره inject بشن ، یک نکته که باید بدونید اینه که دو تا ورودی provider دوم از کجا میاد ؟ یکیش از provider اول میاد (Dagger با استفاده از کلاس هایی که میسازه خودش این رو به سیستم میفهمونه و application که هم که از AppComponent داشتیمش)
خب حالا ما نیازه این Module رو به Component وصل کنیم ، کد مقاله قبل رو بیارید و این رو در قسمت بالایی تغییر بدید :
@Component(modules = [AndroidSupportInjectionModule::class, // special class ActivityBuilderModule::class, AppModule::class]) interface AppComponent : AndroidInjector<App>
تغییراتی که دادیم در خطوط 2 و 3 هست ، خط دوم رو جلوتر میگم و خط سوم هم مشخص میکنه این Module که الان نوشتیم برای کدوم Component هست (که اینجا برای AppComponent میشه) ، خب ما اینجا یک Activity داریم که باید وابستگی ها تزریق بشن ، خط دوم برای همینه ! یک Module خاص که مشخص میکنه کدوم Activity قراره از این وابستگی ها استفاده کنه ، میآییم این Module رو ایجاد میکنیم :
@Module abstract class ActivityBuilderModule { @ContributesAndroidInjector abstract fun contributeAuthActivity() : AuthActivity // AuthActivity is a client , we can inject sth to it }
همون طوری که توی Comment نوشتم و بالا هم توضیح دادم وظیفه این Module اینه که مشخص کنه کدوم Activity قراره برای عملیات Inject استفاده بشه و عبارت ContributesAndroidInjector هم برای همینه (میاد کد هایی رو برای این کار تولید میکنه) ، ولی آیا این کافیه ؟ خودِ Dagger الان قضیه رو میفهمه ؟ نه !
شما برای اینکه این Module به درستی کار کنه باید Activity مورد نظرتون رو از جنس DaggerAppCompatActivity بذارید ، کلِ کلاس Activity ما به این صورت میشه :
class AuthActivity : DaggerAppCompatActivity() { @Inject lateinit var logo : Drawable @Inject lateinit var requestManager : RequestManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_auth) setLogo() } fun setLogo() { requestManager.load(logo).into(img_logo) } }
خب ، چیزی که میبینیم اینه ، دو تا Dependency که اونا رو توی AppModule مشخص کردیم اینجا با عبارت Inject میان تزریق میشن (یه نکته هم بگم ، این کلمه Inject اصلا برای Dagger نیست بلکه تو خود کتابخونه های Java هست ، Dagger برای یک سری از کارا نیومده annotation های جدید رو تعریف کنه و ترجیح داده از همون هایی که قبلا بوده استفاده کنه) و تمام ! الان وقتی Activity ما ایجاد میشه دو تا پارامتری که مشخص کردیم inject میشن و عکس داخل صفحه نشون داده میشه .
من در نوشته های بعد Dagger رو بیشتر بسط میدم و سعی میکنم یک Course کامل براتون توی ویرگول حاضر کنم !
نکته : در صورتی که کد رو خواستید ببینید حتما branch به اسم basic2 رو نگاه کنید (البته فعلا بقیه شو درست نکردم)
https://gitlab.com/drflakelorenzgerman/dagger2/-/tree/basic2