MVP و Dagger 2 - تطبيق أندرويد العظمي - الجزء 2

هذه المقالة هي نتيجة البحث ، الذي كان نتاجه الثانوي تجسيدًا لفكرة طويلة الأمد في تطبيق 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 في تبسيط مهمة تنفيذها وتتبعها.

Source: https://habr.com/ru/post/ar434618/


All Articles