<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فاطمه ملکی</title>
        <link>https://virgool.io/feed/@ftml</link>
        <description>توسعه دهنده موبایل</description>
        <language>fa</language>
        <pubDate>2026-06-29 11:48:59</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/12005/avatar/yDF0Jd.png?height=120&amp;width=120</url>
            <title>فاطمه ملکی</title>
            <link>https://virgool.io/@ftml</link>
        </image>

                    <item>
                <title>پیاده سازی Hilt در یک پروژه اندرویدی</title>
                <link>https://virgool.io/MobileLab/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-hilt-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%DB%8C-xzyrq3jyd8ef</link>
                <description>Hiltهیلت چی هست؟هیلت به کتابخونه تزریق وابستگیه که گوگل جدیدا اراِئه کرده اول اینکه  یه روشه استاندارد و آسون برای تامین وابستگی ها و تزریق اونها توی پروژه اندروید هست دوم اینکه برای هر کامپوننت اندرویدی یه کانتینر در نظر میگیره و چرخه عمر اون رو خودش خودکار مدیریت میکنه.چه مزایایی داره؟طبق گفته ی خود سایت dagger.dev با استفاده از هیلت boilertplate کاهش پیدا میکنه منظورش اینه که بدون اینکه نگرانی در مورد راه اندازی دگر رو داشته باشید به جاش راحتتر روی تعاریف و  کاربردها متمرکز بشید، قابلیت استفاده مجدد از کد ، استفاده و پیاده سازی آسون ، از بین بردن پیچیدگی های تست با دگر ، با استانداردهای تعریف شده دیگه درگیر پیچیدگی های تعریف و ایجاد و استفاده از کامپوننت و ماژول مخصوصا توی کلاسهای پیچیده نمیشید .وابستگی های پروژه :برای شروع دیپندنسی های زیر رو به build.gradle سطح پروژه  به پروژه اضافه میکنیم:dependencies {    def lifecycle_version = &quot;2.3.0-alpha05&quot;    def material_version = &quot;1.1.0&quot;    def room_version = &quot;2.2.5&quot; def hilt_jetpack = &quot;1.0.0-alpha01&quot; // Room implementation &quot;androidx.room:room-runtime:$room_version&quot;    kapt &quot;androidx.room:room-compiler:$room_version&quot; // Activity Ktx for by viewModels() implementation &quot;androidx.activity:activity-ktx:1.1.0&quot; //Dagger - Hilt implementation &quot;com.google.dagger:hilt-android:$hilt_version&quot;    kapt &quot;com.google.dagger:hilt-android-compiler:$hilt_version&quot;    implementation &quot;androidx.hilt:hilt-lifecycle-viewmodel:$hilt_jetpack&quot;    kapt &quot;androidx.hilt:hilt-compiler:$hilt_jetpack&quot; // coroutines implementation &quot;org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6&quot;    implementation &quot;org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6&quot; // ViewModel implementation &#x27;androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha05&#x27; // LiveData implementation &quot;androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version&quot;}خب این دو تا پلاگین رو هم توی گریدل سطح app اضافه کنیم:apply plugin: &#039;kotlin-kapt&#039;
apply plugin: &#039;dagger.hilt.android.plugin&#039; و این دیپندنسی هم به گریدل سطح ماژول باید اضافه کنیم و بعد گریدل رو سینک کنیم:classpath &amp;quotcom.google.dagger:hilt-android-gradle-plugin:$hilt_version&amp;quotمیخوایم تو این پروژه فرضی با استفاده از room یه سری دیتا ذخیره کنیم و لیست کنیم که وظیفه ی تامین و تزریق وابستگی ها با hilt باشه.قدم اول:یک کلاس انتیتی بسازیم که اسمش user باشه و id , name , familiy داخلش داشته باشه:Userقدم دوم:اینترفیس DAO مربوط به کلاس بالا رو میسازیم که شامل دو تا متد insert و getAllUsers هست:UserDaoقدم سوم:کلاس ابسترکتی بسازیم که از RoomDatabase ارث بری میکنه و یه متد بدون بدنه داره که خروجیش از نوع UserDao هست :AppDbتا الان بخشهای مربوط به room رو انجام دادیم حالا بریم سر پیاده سازی Hilt :قدم چهارم:ما نیاز داریم یه کلاسی داشته باشیم که از Application ارث بری میکنه و انوتیشن HiltAndroidApp  بالای سرش هست :HiltApplicationقدم پنجم:این کلاس Application رو توی مانیفست هم معرفی میکنیمandroid:name=&quot;.HiltApplication&quot;قدم ششم:ما باید یه آبجکت به نام DbModule بسازیم برای Hilt بسیازیم تا به hilt بگیم که چطور یه اینستنس از کلاس AppDb بسازه تا مجبور نشیم وقتی از AppDb میخوایم استفاده کنیم اون رو new کنیم و وابستگی هاشو تامین کنیم خود Hilt برای ما زحمتشو بکشه برای اینکار باید این کلاس رو با انوتیت Module تزیین کنیم یعنی به Hilt بفهمونیم این کلاس یه ماژول هست دومین کاری که باید بکنیم اینه که انوتیشن installIn رو بالاسر این کلاس قراار بدیم تا به هیلت بفهمونیم که این ماژول رو روی کدوم کامپوننت سوار کنه ورودی هم بهش ApplicationContext رو میدیم حالا توی این کلاس قراره چخبر باشه؟ قراره یه متد ابسترکت بسازیم که خروجیش AppDb هست و داخل این متد با استفاده از بیلدر  Room کلاس AppDb رو تولید کنیم و برگردونیم این متد هم قراره بالاسرش انوتیشن provides داشته باشه که به هیلت بفهمونه هرجا نیاز به کلاس AppDb داشتی چطور باید تولیدش کنی نهایتا این کلاسه هم این شکلی میشه:DbModule قدم هفتم:حالا باید یه کلاس ریپازیتوری بسازیم که توش یه متد SaveUser داشته باشه که پارامتر ورودی اون از نوع User باشه و داخل ان متد  با استفاده از کلاس UserDao متد insert اون کلاس رو صدا بزنیم و اطلاعات user رو که پاس دادیم ذخیره کنیم ،برای اینکه به userDao دسترسی داشته باشیم توی متد سازنده همین کلاس appDb رو میگیریم تا با استفاده از متد userDao بهش دسترسی پیدا کنیم. قبل از کانستراکتور کلاس ریپازیتوریمون یه انوتیشن inject قرار میدیم تا به هیلت بفهمونیم ما باید از اینستنس این کلاس استفاده کنیم.UserRepositoryقدم هشتم:یه کلاس ویومدل بسازیم و کلاس UserRepository که بالا ساختیم رو اینجکت کنیم داخلش این کلاس باید قبل از متدسازنده ش یه انوتیشن ViewModelInject بذاریم و ورودی کانستراکتورش باید UserRepository  باشه این انوتیشن به هیلت میفهمون که UserRepository  رو اینجکت کن داخل این ویومدل داخل ویدومدل هم یه متد save میذاریم که با استفاده از coroutines و MutableLiveData   یک user رو به متد save ریپازیتوریمون ارسال میکنیم و استتوس true برمیگردونیم به اکتیویتی ای که قراره متصل بشه به این ویومدل ما.UserViewModelقدم نهم:یه اکتیویتی میسازیم که بالاسرش انوتیشن AndroidEntryPoint رو قرار دادیم این انوتیشن وظیفه ش اینه که به هیلت بفهمونه که وابستگی های مربوط به این کامپوننتی که بالاسرش از این انوتیشن استفاده شده رو فراهم کن .این اکتیویتی متصل شده به ویومدلی که بالا ساختیم و اطلاعات ورودی user رو با استفاده از دیتابایندینگ از xml دریافت میکنه و وقتی دکمه save زده شده به متد save ویومدل ما ارسال میشه.UserActivityکارمون تموم شد :)سورس کد هم اینجا گذاشتم:https://github.com/ftml71/SampleHilt</description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Thu, 02 Jul 2020 03:45:46 +0430</pubDate>
            </item>
                    <item>
                <title>تزریق وابستگی با Hilt (یک)</title>
                <link>https://virgool.io/MobileLab/%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C-%D8%A8%D8%A7-hilt-%DB%8C%DA%A9-lcm5vtukqpeh</link>
                <description>تزریق وابستگی با Hilt
اول دیپندنسی ها رو به این شکل وارد میکنیم:buildscript {
    ...
    dependencies {
        ...
        classpath &#039;com.google.dagger:hilt-android-gradle-plugin:2.28-alpha&#039;
    }
}
apply plugin: &#039;kotlin-kapt&#039;
apply plugin: &#039;dagger.hilt.android.plugin&#039;

dependencies {
    implementation &amp;quotcom.google.dagger:hilt-android:2.28-alpha&amp;quot
    kapt &amp;quotcom.google.dagger:hilt-android-compiler:2.28-alpha&amp;quot
}فرض کنیم یه کلاس Car داریم که برای تولید شدن نیاز به کلاس Engine داره و ما میخوایم یه نمونه ازاین کلاس رو در MainActivity داشته باشیم و متدهای اون رو صدا بزنیم. همه برنامه هایی که از Hilt استفاده می کنند باید دارای یک کلاس از نوع اپلیکیشن باشند که انوتیشن HiltAndroidApp رو داشته باشن.پس کلاس App رو ایجاد میکنیم که از Application ارث بری کرده و بالاسرش انوتیشن @HiltAndroidApp رو قرار میدیم.@HiltAndroidApp
class App : Application()بعد از ایجاد Hilt در کلاس اپلیکیشن شما ، Hilt می تواند وابستگی به سایر کلاسهای Android که دارای انوتیشن AndroidEntryPoint باشند رو فراهم کنه پس کلاس MainActivity ما اینشکلی میشه:@AndroidEntryPoint
class MainActivity: AppCompatActivity() { ... }در حال حاضر Hilt از کلاسهای زیر را پشتیبانی می کنه و انوتیشن AndroidEntryPoint رو میتونیم براشون به کار ببریم:Application (by using @HiltAndroidApp)ActivityFragmentViewServiceBroadcastReceiverخب کلاس Car ما اینشکلی میشه:  Carکلاس Engine هم اینشکلی میشه:Engineحالا توی کلاس MainActivity میتونیم یه فید از نوع Car بسازیم که lateinit باشه  و متد start رو صدا بزنیم وظیفه تامین وابستگی به Car رو به هیلت بسپره MainActivity الان اینشکلی شده:MainActivityاگه برنامه رو run کنیم میبینیم که خروجی به این شکل میشه:logcat</description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Tue, 30 Jun 2020 01:04:35 +0430</pubDate>
            </item>
                    <item>
                <title>دگر آسونه قسمت 4 (Inject Values)</title>
                <link>https://virgool.io/@ftml/%D8%AF%DA%AF%D8%B1-%D8%A2%D8%B3%D9%88%D9%86%D9%87-%D9%82%D8%B3%D9%85%D8%AA-4-inject-values-ugn2ocbppiis</link>
                <description>فرض کنیم کلاس DiselEngine که توی قسمت قبل در موردش حرف زدیم به تنهایی قابل پیاده سازی نیست و نیاز به horsePower داره که مقدارش رو از کاربر در ران تایم باید بگیره. توی کلاس DiselEngine یه فیلد به نام horsePower اضافه کردیم که از کانستراکتور ایم کلاس قراره پرش کنیم و وقتی متد start صدا شد قراره مقدار horsePower  رو لاگ بندازیم پس کلاس  DiselEngine  اینشکلی میشه:public class DiselEngine implements Engine {
    private static final String TAG = &amp;quotDagger2 DiselEngine&amp;quot
    private final int horsePower;

    @Inject
    public DiselEngine(int horsePower) {
        this.horsePower = horsePower;
        Log.d(TAG, &amp;quotDiselEngine created&amp;quot);
    }

    @Override
    public void start() {
        Log.d(TAG, &amp;quotDiselEngine started , horsePower = &amp;quot + horsePower);
    }}حالا توی DiselEnginModule باید کلاس بالایی رو بشناسونیم تا وقتی دگر رسید به جایی که میخواست engine تولید کنه بدونه از کجا باید ایجادش کنه و horsePower رو از کجا بیاره پس یه متد provideEngine میسازیم که خروجیش Engine باشه و DiselEngine رو پاس میدیم بهش که در کانستراکتورش توی کلاس بالا گفتیم که یک مقدار int برای horsePower  میگیره و این مقدار رو مجددا از DiselEnginModule  دریافت میکنیم کلاس DiselEnginModule این شکلی میشه:@Module
public class DiselEnginModule {
    private final int horsePower;

    public DiselEnginModule(int horsePower) {
        this.horsePower = horsePower;
    }

    @Provides
    Engine provideEngin() {
        return new DiselEngine(horsePower);
    }
}خب تا اینجا اگه برنامه رو ران کنیم یه خطا میده بهمون و میگه DaggerAppComponent دیگه متدی به نام create نداره و ما خودمون باید builder این کلاس رو صدا بزنیم و مقادیر رو بهش پاس بدیم توی mainActivity که کامپوننت رو ایجاد کرده بودیم میریم و تغییرات رو اینجوری اعمال میکنیم:AppComponent component = DaggerAppComponent.builder()
        .diselEnginModule(new DiselEnginModule(120)).build();یعنی به دگر گفتیم که هروقت نیاز به تولیدEngine داشتی برو DiselEnginModule رو پیدا کن و مقدار  horsePower  رو مساوی با 120 قرار بده اگه برنامه رو اجرا کنیم لاگ هامون این شکلی میشه :D: DiselEngine createdD: Tire CreatedD: Tire inflatedD: Wheels CreatedD: car createdD: DiselEngine started , horsePower = 120D: driving</description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Sat, 20 Jun 2020 15:59:59 +0430</pubDate>
            </item>
                    <item>
                <title>دگر آسونه قسمت 3 (Binds@)</title>
                <link>https://virgool.io/@ftml/%D8%AF%DA%AF%D8%B1-%D8%A2%D8%B3%D9%88%D9%86%D9%87-%D9%82%D8%B3%D9%85%D8%AA-3-binds-keoa6nkaix1d</link>
                <description>خب از binds وقتی استفاده میکنیم که وابستگی به اینترفیس یا کلاس ابسترکتی داشته باشیم توی مثال قبل فرض کنیم Engine یک اینترفیس هستش که یک متد داره به نام start که این متد هرجایی که قراره از این اینترفیس ارث بری بشه پیاده سازی میشه نحوه روشن شدن موتور هر ماشین یک جور خاص پیاده سازی میشه حالا برای اینکه بخوایم با دگر این وابستگی رو برطرف کنیم یا از انوتیشن provides استفاده میکنیم یا از binds اول provides رو بررسی کنیم .Engine به این شکل هست:public interface  Engine {
     void start();
}خب حالا یه کلاس میسازیم که از Engine ارث بری کنه به نام DiselEngine که اینشکلیه:public class DiselEngine implements Engine {
    private static final String TAG = &amp;quotDiselEngine&amp;quot
    @Inject
    public DiselEngine() {
    }
    @Override
    public void start() {
        Log.d(TAG, &amp;quotstart: DiselEngine&amp;quot);
    }}چون این کلاس اکسترنال لایبرری هست ما از ماژول برای شناسوندن وابستگی ها استفاده میکنیم پس یه کلاس DiselEngineModule هم میسازیم که داری انوتیشن module هست و یه متد داخلش قرار میدیم که خروجی اون متد Engine هست @Module
public class DiselEnginModule {
    @Provides
     Engine provideEngin() {
        return new DiselEngine();
    }
}نکته : وقتی توی ماژول متدهارو استاتیک میکنید، دیگه دگر مجبور نیست برای فراخوانی متد‌های کلاس ماژولتون یک object ازش بسازه و میتونه بدون اینکار مستقیما متدهارو صدا بزنه، در نتیجه بازدهی بالاتر میره.با توجه به نکته ی بالا اگه ماژلمون این شکلی باشه بازده بهتری داریم:@Module
 public class DiselEnginModule {
     @Provides    
static  Engine provideEngin() {   
      return new DiselEngine();     
} }توی AppComponent هم ماژولش رو اضافه میکنیم:@Component(modules = {DiselEnginModule.class, WheelsModule.class})
public interface AppComponent {
    Car getCar();
    void inject(MainActivity activity);
}اگه خروجی بگیریم میبینیم که ترتیب لاگها این شکلی میشن:D: DiselEngine createdD: Tire CreatedD: Tire inflatedD: Wheels CreatedD: car createdD: DiselEngine startedD: driving یه روش دیگه اینه که از binds استفاده کنیم برای استفاده از binds باید توی DiselEnginModule چند تا تغییر بدیم اول اینکه متد و کلاسمون رو abstract کنیم دوم اینکه بالای متدمون انوتیشن @Binds بزنیم سوم اینکه  DiselEngin رو به عنوان ورودی به متدمون بفرستیم و متدمون هم بدنه نداشته باشه.بعد از اجرا بازک خروجی بالا رو خواهیم داشت . یعنی این شکلی:@Module
public abstract class DiselEnginModule {
    @Binds
    abstract Engine bindEngine(DiselEngine diselEngine);
}</description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Sat, 20 Jun 2020 15:59:13 +0430</pubDate>
            </item>
                    <item>
                <title>دگر آسونه قسمت 2 (Module , @provides@)</title>
                <link>https://virgool.io/@ftml/%D8%AF%DA%AF%D8%B1-%D8%A2%D8%B3%D9%88%D9%86%D9%87-%D9%82%D8%B3%D9%85%D8%AA-2-module-provides-fsdlwy4tulr0</link>
                <description>خب تا اینجا با سه مدل اینجکت آشنا شدیم اما External Library ,  Interface , Lifecycle ها میتونن قضیه رو پیچیده کنن فرض کنیم که ماشین ما برای تولید شدن به غیر از Engine به یه کلاس دیگه هم وابسته باشه که این کلاس هم خودش به کلاس دیگه ای وابسته هست و کل این مجموعه توی یه اکسترنال لایبرری هست که ما اصلا دسترسی بهشون نداریم که بخوام inject رو اضافه کنیم.یه کلاس wheels ایجاد میکنیم که این کلاس car بهش وابسته هست و خود این کلاس هم به کلاس Tire وابسته هست فرض رو بر این میگیریم که به این دو تا کلاس دسترسی نداریم و از inject نمیتونیم استفاده کنیم.این کلاس Wheels :public class Wheels {
    public static final String TAG=&amp;quotWheels&amp;quot
    Tire tire;

    public Wheels(Tire tire) {
        this.tire = tire;
        Log.d(TAG, &amp;quotWheels Created&amp;quot);
    }}این کلاس Tire:public class Tire {
    public static final String TAG =&amp;quotTire&amp;quot
    public Tire() {
        Log.d(TAG, &amp;quotTire Created&amp;quot);
    }

    public void inflate() {
        Log.d(TAG, &amp;quotTire inflated&amp;quot);
    }}این هم تغییراتی هست که داخل car دادیمpublic class Car {
    private static final String TAG = &amp;quotCar&amp;quot
    @Inject
    Engine engine;
    Wheels wheels;

    @Inject
    public Car(Wheels wheels) {
        this.wheels = wheels;
        Log.d(TAG, &amp;quotcar created&amp;quot);
    }

    @Inject
    public void drive() {
        Log.d(TAG, &amp;quotdriving&amp;quot);
    }}چون دسترسی به اکسترنال لایبرری ها نداریم پس برای تامین وابستگی ها راه حل این هست که از module استفاده کنیم پس یه کلاس دیگه میسازیم به نام WheelsModule و بالا سرش انوتیشن module رو قرار میدیم این انوتیشن به دگر میگه که برای پیدا کردن و تامین وابستگی هات به Wheels باید از این بخش استفاده کنی خب ما برای اینکه وابستگی به wheels رو برطرف کنیم وابسته به کلاس Tire هم هستیم پس توی این کلاس ماژول به متدی نیاز داریم که خروجی از نوع Tire داشته باشه و انوتیشن provide بالاسرش بذاریم همینکار رو برای wheels هم انجام میدیم و در ورودی متد Tire رو پاس میدیم کلا هروقت که ما میخوایم به چیزی خارج از کلاسهای خودمون و در لایبرری های خارجی دسترسی داشته باشیم از دوتا انوتیشن خارجی استفاده میکنیم که یکی از اونها provide هست و دیگری bind.اینم نحوه پیاده سازی کلاس ماژول ما هست:@Module
public class WheelsModule {
    @Provides
    Tire provideTire() {
        Tire tire = new Tire();
        tire.inflate();
        return tire;
    }

    @Provides
    Wheels provideWheels(Tire tire){
        return new Wheels(tire);
    }}خب حالا باید به دگر بفهمونیم که هر وقت این کامپوننت وابسته به Wheels بود وابستگیش رو از کلاس WheelsModule تامین کنه برای اینکار در کلاس AppComponent  جلوی انوتیشن component یه پرانتز باز میکنیم  و wheelsModule رو بهش معرفی میکنیم اینطوری:@Component(modules = WheelsModule.class)
public interface AppComponent {
    Car getCar();
    void inject(MainActivity activity);
}دیگه نیازی نیست تغیرات دیگه ای ایجاد کنیم فقط کافیه برنامه رو اجرا کنیم میبینیم که به ترتیب لاگ ساخت tire بعد لاگ inflate tire بعد ساخت wheels و بعد ساخت car ایجاد میشه.</description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Sat, 20 Jun 2020 15:58:38 +0430</pubDate>
            </item>
                    <item>
                <title>دگر آسونه قسمت 1(component , @inject@)</title>
                <link>https://virgool.io/@ftml/%D8%AF%DA%AF%D8%B1-%D8%A2%D8%B3%D9%88%D9%86%D9%87-%D9%82%D8%B3%D9%85%D8%AA-1component-inject-uzhvxholfava</link>
                <description>یه کلاس Car داریم که که وابسته هست به کلاس Engine یعنی هر ماشین برای ساخته شدن باید یک موتور براش ساخته بشه.فرض کنیم کلاس Car , Engine به این شکل هستن:public class Car {
    private static final String TAG = &amp;quotCar&amp;quot
    private Engine engine;
    public Car(Engine engine) {
        this.engine = engine;
        Log.d(TAG, &amp;quotcar created&amp;quot);
    }
    public void drive() {
        Log.d(TAG, &amp;quotdriving&amp;quot);
    }
}public class Engine {
    public static final String TAG = &amp;quotEngine&amp;quot

    public Engine() {
        Log.d(TAG, &amp;quotengine created&amp;quot);

    }
}خب توی حالت عادی برای صدا کردن متد drive در کلاس car باید یک شی از engine بسازیم و اون رو به شی ساخته شده از کلاس car بفرستیم و متد مورد نظر رو صدا کنیم اینجوری:Engine engine = new Engine();
Car car = new Car(engine);
car.drive();با استفاده از دگر ما از شر این new کردن ها راحت میشیم دیگه دگر مسئولیت فراهم کردن وابستگی ها و نیازمندی ها رو به عهده میگیره و ما فقط متد مربوطه رو صدا میکنیم برای شروع کار با دگر قبل از کانستراکتور هامون که نیازمندی یه کلاس دیگه هستن و ما قراره ازشون یک شی بسازیم یه انوتیشن inject رو میذاریم تو مثال ما Engine یک نیازمندی برای کلاس Car هست پس قبل از کانستراکتور Engine یک inject قرار میدیم از طرفی برای استفاده از متد های درون Car نیاز هست یک شی هم از Car بسازیم پس یک inject هم برای Car قرار میدیم که کلاسهامون بعد از این تغییرات این شکلی میشن:public class Car {
    private static final String TAG = &amp;quotCar&amp;quot
    private Engine engine;

    @Inject
    public Car(Engine engine) {
        this.engine = engine;
        Log.d(TAG, &amp;quotcar created&amp;quot);
    }

    public void drive() {
        Log.d(TAG, &amp;quotdriving&amp;quot);
    }
}public class Engine {
    public static final String TAG = &amp;quotEngine&amp;quot

    @Inject
    public Engine() {
        Log.d(TAG, &amp;quotengine created&amp;quot);
    }
}حالا یه اینترفیس باید بسازیم که  اونوتیشن component رو داشته باشه بالاسرش حالا کار اینترفیس چیه ؟ فریم ورک دگر برای تولید کدی که نیازمندی های مورد درخواست کلاس را فراهم کنه از این اینترفیس استفاده میکنه کد زیر رو ببینید:@Component
public interface AppComponent {}خب حالا باید داخل این اینترفیس یک متد بسازیم که خروجی اون از نوع کلاسی باشه که ما میخوایم ازش شی داشته باشیم خروجی از نوع Car باشه@Component
public interface AppComponent {
    Car getCar();
}حالا یه بار پروژه رو بیلد میکنیم که دگر فایلهای مربوط به خودش رو بسازه  توی اکتیویتی ای که هستیم و میخوایم از car استفاده کنیم باید یه شی بسازیم از نوع AppComponent  و با استفاده از کلاسی که دگر ساخته اون رو ایجاد کنیم دگر بعد از بیلد کردن یه کلاس برای ما ساخته با اسم DaggerAppComponentکه این کلاس یه متد create داره که وظیفه ش ساخت وابستگی هاس کدمون داخل اکتیویتی این شکلی شده تا الان :AppComponent component = DaggerAppComponent.create();حالا یه شی از کار میسازیم و با استفاده از component اون رو مقدار دهی میکنیم.Car car=   component.getCar();حالا با استفاده از car میتونیم متد درایو رو صدا کنیمcar.drive();سه مدل inject داریم :Constructor InjectionField InjectionMethod injectionمورد اول یعنی Constructor Injection رو که بررسی کردیم حالا به تغییراتی که توی کلاس car میدیم نگاه کنید engine رو از داخل کانستراکتور خارج کردیم و بالاسر فیلدش یه inject زدیم public class Car {
    private static final String TAG = &amp;quotCar&amp;quot
    @Inject Engine engine;
    @Inject
    public Car() {
        Log.d(TAG, &amp;quotcar created&amp;quot);
    }
    public void drive() {
        Log.d(TAG, &amp;quotdriving&amp;quot);
    }
}اگه برنامه رو ران کنیم میبینم که لاگهایی که داخل Engine هم گذاشتیم ایجاد میشن .توی اکتیویتی میام و car رو هم تبدیل به فیلد میکنم و یه انوتیشن inject بالاسرش قرار میدم توی کلاس AppComponnent میرم یه متد void ایجاد میکنم به نام inject و توی ورودی بهش اکتیویتی رو پاس میدمحالا اگه توی اکتیویتی فقط این متد inject رو صدا بزنیم وقتی برنامه اجرا شه به ترتیب لاگ ساخت Engine و لاگ ساخت Car ایجاد میشن.public class MainActivity extends AppCompatActivity {
    @Inject   Car car;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AppComponent component = DaggerAppComponent.create();
        component.inject(this);
    }}اینم کلاس AppComponent@Component
public interface AppComponent {
    Car getCar();
    void inject (MainActivity activity);
} این حالت Field Injection بود .حالا اگه توی کلاس car بالای drive هم یک انوتیشن inject بذاریم موقع اجرا بدون اینکه نیاز باشه این متد رو صدا کنیم کدهای داخل اون هم اجرا میشن که به این حالت Method injection میگیمpublic class Car {
    private static final String TAG = &amp;quottag Car&amp;quot
    @Inject Engine engine;

    @Inject
    public Car() {
        Log.d(TAG, &amp;quotcar created&amp;quot);
    }
@Inject
    public void drive() {
        Log.d(TAG, &amp;quotdriving&amp;quot);
    }
}یه پروژه ساختم توی این آدرس  همه کدهایی که قراره استفاده شه رو توی برنچ های مختلف قرار دادم: https://github.com/ftml71/Dagger </description>
                <category>فاطمه ملکی</category>
                <author>فاطمه ملکی</author>
                <pubDate>Sat, 20 Jun 2020 15:43:23 +0430</pubDate>
            </item>
            </channel>
</rss>