Artikel ini adalah hasil penelitian, produk sampingan yang merupakan perwujudan dari ide lama dalam satu aplikasi Android yang sangat berguna dan hilang - My Location Notifier , yang dirancang untuk secara otomatis memberi tahu penerima tentang kedatangan pengguna (lihat uraian terperinci di sini ).Jadi,
pada bagian pertama, kami membangun kerangka utama aplikasi Android sesuai dengan arsitektur MVP. Sekarang mari kita mulai meniduri Belati 2 untuk itu.
2.1. PresetUntuk memulai, buka file build.gradle (Project: mymvcapp) dan tambahkan baris berikut ke bagian buildscript:
ext.dagger2_version = "2.8"
Pada saat penulisan ini, ini adalah versi terbaru dari Dagger 2. Selanjutnya, buka file build.gradle (Module: app) dan tambahkan baris ke awal:
apply plugin: 'kotlin-kapt'
Ini diperlukan agar di Dagger 2 dapat menghasilkan kodenya saat dikompilasi. Nanti kamu akan mengerti kenapa.
Sekarang tambahkan dependensi yang diperlukan:
implementation "com.google.dagger:dagger:$dagger2_version" kapt "com.google.dagger:dagger-compiler:$dagger2_version"
2.2. Persiapan injeksiKami akan menyinkronkan proyek dan kembali ke komponen MainScreen. Buat kelas di.MainScreenModule dalam paket di belakang panggung dan tandai dengan anotasi
Modul . Di kelas baru, kami mendeklarasikan dan mengimplementasikan metode ProvidPresenter (): MainScreenPresenter = MainScreenPresenter dan menandainya dengan anotasi
Provides dan
Singleton . Jadi sekarang kelas kita akan terlihat:
@Module class MainScreenModule { @Provides @Singleton fun providesPresenter(): MainScreenPresenter = MainScreenPresenter() }
Sekarang kita akan pergi ke kelas MainScreenCompatActivity dan mengganti pengubah variabel presenter dengan lateinit var, menghapus penetapan nilai dan menandainya dengan anotasi
Suntikan :
class MainScreen : BaseCompatActivity(), MainScreenContract.View { @Inject lateinit var presenter: MainScreenPresenter override fun init(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main_screen) presenter.attach(this) } }
Perhatikan bahwa kita sekarang tidak memerlukan tanda tanya saat mengakses variabel ini.
Tampaknya semuanya disuntikkan, tugas selesai. Tapi tidak. Sekarang kita perlu mendapatkan Belati untuk menghasilkan kode yang diperlukan untuk menyuntikkan ketergantungan pertama kita. Itu sebabnya kami menambahkan plugin kotlin-kapt ke skrip build di atas. Dalam paket com.caesar84mx.mymvcapp, buat paket di.config di mana kita akan membuat antarmuka AppDiComponent.

Sekarang, mari kita mendeklarasikan antarmuka komponen dan tunggal
dan menyedihkan , daftarkan modul kami di dalamnya, dan nyatakan metode injeksi (mainScreenActivity: MainScreen) di dalam antarmuka:
@Component( modules = [ MainScreenModule::class ] ) @Singleton interface AppDiComponent { fun inject(mainScreenActivity: MainScreen) }
Dan sekarang, Anda akhirnya harus membuat Dagger menghasilkan semua kode yang diperlukan. Untuk melakukan ini, kita akan membuat kelas MyMvpApp dalam paket config.di, mewarisinya dari kelas Aplikasi, mendaftarkan kelas di AndroidManifest.xml dengan menulis baris android: name = ". Config.di.MyMvpApp" di tag aplikasi. Selanjutnya, deklarasikan variabel lateinit var injector: AppDiComponent, atur ke setter pribadi, dan definisikan kembali metode onCreate (). Dan mulailah keajaiban:
class MyMvpApp: Application() { lateinit var injector: AppDiComponent private set override fun onCreate() { super.onCreate() injector = DaggerAppDiComponent.builder() .mainScreenModule(MainScreenModule()) .build() } }
Seperti yang Anda lihat, kelas DaggerAppDiComponent belum ada, itu akan dihasilkan selama pembuatan aplikasi. Serta implementasi komponen kami. Nama kelas terdiri dari kata "Belati" + nama antarmuka yang ditandai sebagai komponen. Metode mainScreenModule () juga akan dihasilkan selama pembangunan proyek, nama harus terdiri dari nama kelas dari modul yang disuntikkan di lowerCamelCase.
Kami merakit proyek (Bangun β Buat Proyek). Nikmati pembuatan kode otomatis dan lanjutkan.
2.3. InjeksiPerhatian: selanjutnya, beberapa tarian dengan rebana dengan unsur-unsur porno akan disajikan. Permintaan untuk menghapus anak-anak dan orang-orang gugup dari layar.
Untuk injeksi yang berhasil, kami akan memerlukan referensi ke variabel injector. Setuju, membuat instance MyMvpApp di setiap kelas tempat kami menyuntikkan bukan solusi terbaik. Karena itu, kami akan melakukan hal berikut:
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!! } }
Dihembuskan, kembali ke kelas MainScreen. Sekarang, masukkan presenter kita ke metode init (). Jangan lupa bahwa tindakan ini harus dilakukan sebelum akses pertama ke variabel yang disuntikkan. Jadi sekarang kelas kita terlihat seperti:
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) } }
Dan inilah seluruh struktur dasar aplikasi kita:
2.4. KesimpulanJadi, kami siap untuk struktur minimal aplikasi, yang di atasnya hanya menggantung elemen. Perlu kegiatan baru? Kami mewakilinya sebagai komponen, pisahkan ui dari belakang panggung, untuk setiap komponen kami menentukan dependensi apa yang kami butuhkan (minimum, presenter dalam aktivitas, atau mungkin dalam presenter sendiri API untuk berinteraksi dengan layanan jarak jauh, atau, misalnya, API repositori untuk bekerja dengan database), mendaftarkan modul dengan dependensi, mendaftarkan modul dalam komponen, mendaftar di pembangun, membangun kembali proyek, menyuntikkan dependensi jika perlu, ulangi pengulangan untuk setiap komponen baru.
Tentu saja, mungkin timbul pertanyaan: mengapa kita membutuhkan belati? Lagi pula, mereka melakukan pekerjaan yang sangat baik? Hebat, sementara aplikasinya kecil. Ketika ia tumbuh penuh, dengan lusinan aktivitas, fragmen, adaptor, permintaan server, caching data, dan keajaiban lainnya, akan ada banyak dependensi yang sulit dilacak dalam aplikasi besar jika Anda tidak menggunakan Dependency Injection. Kerangka DI Dagger membantu menyederhanakan tugas menerapkan dan melacak mereka.