هذه المقالة هي نتيجة البحث ، الذي كان نتاجه الثانوي تجسيدًا لفكرة طويلة الأمد في تطبيق Android مفيد للغاية ومفقود مرة واحدة - My Location Notifier ، المصمم لإعلام المستلم تلقائيًا بوصول مستخدم (انظر الوصف التفصيلي هنا ).لذلك ،
في الجزء الأول ، قمنا ببناء الهيكل الرئيسي لتطبيق أندرويد بما يتوافق مع بنية MVP. الآن لنبدأ في شد خنجر 2 إليها.
2.1. مسبقاللبدء ، انتقل إلى ملف build.gradle (Project: mymvcapp) وأضف السطر التالي إلى قسم مخطط البناء:
ext.dagger2_version = "2.8"
في وقت كتابة هذا التقرير ، هذا هو أحدث إصدار من Dagger 2. بعد ذلك ، انتقل إلى ملف build.gradle (الوحدة النمطية: التطبيق) وأضف السطر إلى البداية:
apply plugin: 'kotlin-kapt'
يعد ذلك ضروريًا حتى يتمكن Dagger 2 من إنشاء الكود الخاص به عند التحويل البرمجي. في وقت لاحق سوف تفهم لماذا.
الآن إضافة التبعيات اللازمة:
implementation "com.google.dagger:dagger:$dagger2_version" kapt "com.google.dagger:dagger-compiler:$dagger2_version"
2.2. إعداد الحقنسنقوم بمزامنة المشروع والعودة إلى مكون الشاشة الرئيسية. إنشاء di.MainScreenModule فئة في حزمة وراء الكواليس ووضع علامة عليها مع الشرح
الوحدة النمطية . في الفصل الدراسي الجديد ، نعلن وننفّذ طريقة providePresenter (): MainScreenPresenter = MainScreenPresenter ووضع علامة عليها مع شروح
Provides و
Singleton . حتى الآن سيبدو صفنا:
@Module class MainScreenModule { @Provides @Singleton fun providesPresenter(): MainScreenPresenter = MainScreenPresenter() }
سننتقل الآن إلى فئة MainScreenCompatActivity ونستبدل المعدلات الخاصة بمتغير مقدم العرض بالرمز المتأخر var ، وحذف تعيين القيمة ووضع علامة عليها مع تعليق
Inject :
class MainScreen : BaseCompatActivity(), MainScreenContract.View { @Inject lateinit var presenter: MainScreenPresenter override fun init(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main_screen) presenter.attach(this) } }
لاحظ أننا الآن لا نحتاج إلى علامة استفهام عند الوصول إلى هذا المتغير.
قد يبدو أن كل شيء يتم حقنه ، اكتمال المهمة. لكن لا. الآن نحن بحاجة إلى الحصول على خنجر لإنشاء التعليمات البرمجية اللازمة لحقن التبعية الأولى لدينا. لهذا السبب أضفنا البرنامج المساعد kotlin-kapt إلى البرنامج النصي للبناء أعلاه. في الحزمة com.caesar84mx.mymvcapp ، قم بإنشاء حزمة di.config التي ننشئ بها واجهة AppDiComponent.

الآن ، دعنا نعلن أن الواجهة هي مكون وواحد مفرد
وبائسة ، قم بتسجيل الوحدة الخاصة بنا فيه ، ونعلن طريقة الحقن (mainScreenActivity: MainScreen) داخل الواجهة:
@Component( modules = [ MainScreenModule::class ] ) @Singleton interface AppDiComponent { fun inject(mainScreenActivity: MainScreen) }
والآن ، يجب عليك أخيرًا أن تجعل الخنجر يولد كل الشفرة اللازمة. للقيام بذلك ، سنقوم بإنشاء فئة MyMvpApp في حزمة config.di ، ورثها من فئة التطبيق ، وتسجيل الفصل في AndroidManifest.xml عن طريق كتابة السطر android: name = ". Config.di.MyMvpApp" في علامة التطبيق. بعد ذلك ، قم بتعريف المتاخمة lateinit var injector: AppDiComponent ، اضبطها على محدد خاص ، وأعد تعريف طريقة onCreate (). وابدأ السحر:
class MyMvpApp: Application() { lateinit var injector: AppDiComponent private set override fun onCreate() { super.onCreate() injector = DaggerAppDiComponent.builder() .mainScreenModule(MainScreenModule()) .build() } }
كما ترون ، فئة DaggerAppDiComponent غير موجودة حتى الآن ، سيتم إنشاؤها أثناء إنشاء التطبيق. وكذلك تنفيذ مكوننا. يتكون اسم الفئة من كلمة "Dagger" + اسم الواجهة المميزة كمكون. سيتم أيضًا إنشاء طريقة mainScreenModule () أثناء إنشاء المشروع ، ويجب تجميع الاسم من اسم فئة الوحدة النمطية التي تم حقنها في lowerCamelCase.
نقوم بتجميع المشروع (Build → Make Project). استمتع بإنشاء الشفرة التلقائية وتابع.
2.3. حقنانتباه: علاوة على ذلك ، سيتم تقديم بعض الرقصات مع الدف مع عناصر الإباحية. طلب إزالة الأطفال والأشخاص العصبيين من الشاشة.
للحقن الناجح ، سنحتاج إلى مرجع لمتغير الحاقن. توافق على أن إنشاء مثيل لـ MyMvpApp في كل فصل حيث نحقن ليس الحل الأفضل. لذلك ، سنفعل ما يلي:
class MyMvpApp: Application() { lateinit var injector: AppDiComponent private set override fun onCreate() { super.onCreate() INSTANCE = this injector = DaggerAppDiComponent.builder() .mainScreenModule(MainScreenModule()) .build() } companion object { private var INSTANCE: MyMvpApp? = null @JvmStatic fun get(): MyMvpApp = INSTANCE!! } }
الزفير ، عاد إلى فئة الشاشة الرئيسية. الآن ، أدخل مقدمنا في طريقة init (). لا تنس أنه يجب تنفيذ هذا الإجراء قبل أول وصول إلى المتغير المحقن. حتى الآن يبدو صفنا:
class MainScreen : BaseCompatActivity(), MainScreenContract.View { @Inject lateinit var presenter: MainScreenPresenter override fun init(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main_screen) MyMvpApp.get().injector.inject(this) presenter.attach(this) } }
وهنا هو الهيكل الأساسي كله من تطبيقنا:
2.4. الخاتمةلذلك ، نحن مستعدون للهيكل الأدنى للتطبيق ، والذي يبقى فقط لتعليق العناصر. هل تحتاج إلى نشاط جديد؟ نحن نمثلها كعنصر ، ونفصل عن واجهة المستخدم من وراء الكواليس ، ونحدد لكل عنصر ما التبعيات التي نحتاجها (الحد الأدنى ، مقدم في النشاط ، أو ربما في مقدم العرض نفسه واجهة برمجة التطبيقات للتفاعل مع خدمة عن بعد ، أو على سبيل المثال ، واجهة برمجة تطبيقات مستودع التخزين للعمل مع قاعدة بيانات) ، تسجيل الوحدة النمطية مع التبعيات ، تسجيل الوحدة النمطية في المكون ، التسجيل في البناء ، إعادة إنشاء المشروع ، حقن التبعيات عند الضرورة ، كرر التكرار لكل مكون جديد.
بالطبع ، قد يطرح السؤال: لماذا نحتاج إلى خنجر؟ بعد كل شيء ، لقد قاموا بعمل ممتاز ، أليس كذلك؟ عظيم ، في حين أن التطبيق صغير. عندما يكبر ، مع العشرات من الأنشطة والشظايا والمحولات وطلبات الخادم وتخزين البيانات المؤقت وغيرها من العجائب ، سيكون هناك العديد من التبعيات التي يصعب تتبعها في تطبيق كبير إذا كنت لا تستخدم Dependency Injection. يساعد إطار Dagger DI في تبسيط مهمة تنفيذها وتتبعها.