Bagaimana cara menggunakan Dagger? Bagaimana cara mengkonfigurasi Dagger agar berfungsi di proyek Android saya?
Saya ingin menggunakan Dagger dalam proyek Android saya, tetapi menurut saya itu membingungkan.
EDIT: Dagger2 juga keluar sejak 2015 04 15, dan itu bahkan lebih membingungkan!
[Pertanyaan ini adalah "rintisan" yang akan saya tambahkan ke jawaban saya saat saya mempelajari lebih lanjut tentang Dagger1, dan mempelajari lebih lanjut tentang Dagger2. Pertanyaan ini lebih merupakan panduan daripada "pertanyaan".]
android
dependency-injection
dagger
dagger-2
EpicPandaForce
sumber
sumber
ViewModel
danPageKeyedDataSource
? Seperti saya menggunakan RxJava2, dan ingin CompositeDisposable dibagikan oleh kedua kelas dan jika pengguna menekan tombol kembali, saya ingin menghapus objek Disposable. Saya telah menambahkan kasus di sini: stackoverflow.com/questions/62595956/…ViewModel
dan mungkin meneruskan compositeDisposable yang sama sebagai argumen konstruktor dari PageKeyedDataSource kustom Anda, tetapi saya tidak akan benar-benar menggunakan Dagger untuk bagian itu karena Anda memerlukan subkomponen berlangganan, dan Hilt tidak akan benar-benar mendukungnya. mudah untukmu.Jawaban:
Panduan untuk Dagger 2.x (Edisi Revisi 6) :
Langkah-langkahnya adalah sebagai berikut:
1.) tambahkan
Dagger
kebuild.gradle
file Anda :.
.
2.) Buat
AppContextModule
kelas Anda yang menyediakan dependensi.3.) membuat
AppContextComponent
kelas yang menyediakan antarmuka untuk mendapatkan kelas yang dapat diinjeksi.3.1.) Beginilah cara Anda membuat modul dengan implementasi:
Hati-hati:: Anda perlu memberikan
@Scope
anotasi (suka@Singleton
atau@ActivityScope
) pada@Provides
metode anotasi modul untuk mendapatkan penyedia yang tercakup dalam komponen yang Anda buat, jika tidak maka akan tidak tercakup, dan Anda akan mendapatkan instance baru setiap kali Anda memasukkan.3.2.) Buat komponen Cakupan aplikasi yang menentukan apa yang dapat Anda masukkan (ini sama dengan yang ada
injects={MainActivity.class}
di Dagger 1.x):3.3.) Untuk dependensi yang dapat Anda buat sendiri melalui konstruktor dan tidak ingin didefinisikan ulang menggunakan a
@Module
(misalnya, Anda menggunakan ragam build sebagai gantinya untuk mengubah jenis implementasi), Anda dapat menggunakan@Inject
konstruktor beranotasi.Selain itu, jika Anda menggunakan
@Inject
konstruktor, Anda dapat menggunakan injeksi bidang tanpa harus memanggil secara eksplisitcomponent.inject(this)
:Ini
@Inject
kelas konstruktor secara otomatis ditambahkan ke komponen lingkup yang sama tanpa harus secara eksplisit menentukan mereka dalam modul.Sebuah
@Singleton
scoped@Inject
kelas konstruktor akan terlihat dalam@Singleton
komponen scoped.3.4.) Setelah Anda menentukan implementasi khusus untuk antarmuka tertentu, seperti:
Anda harus "mengikat" penerapan khusus ke antarmuka dengan file
@Module
.Singkatnya untuk ini karena Dagger 2.4 adalah sebagai berikut:
4.) buat
Injector
kelas untuk menangani komponen tingkat aplikasi Anda (menggantikan monolitikObjectGraph
)(catatan:
Rebuild Project
untuk membuatDaggerApplicationComponent
kelas pembangun menggunakan APT)5.) buat
CustomApplication
kelas Anda6.) tambahkan
CustomApplication
keAndroidManifest.xml
.7.) Masukkan kelas Anda
MainActivity
8.) Selamat menikmati!
+1.) Anda dapat menentukan
Scope
untuk komponen Anda yang dengannya Anda dapat membuat komponen cakupan tingkat Aktivitas . Langganan memungkinkan Anda menyediakan dependensi yang hanya Anda perlukan untuk subskop tertentu, bukan di seluruh aplikasi. Biasanya, setiap Aktivitas mendapatkan modulnya sendiri dengan penyiapan ini. Harap diperhatikan bahwa penyedia terbatas ada per komponen , artinya untuk mempertahankan instance untuk aktivitas itu, komponen itu sendiri harus bertahan dari perubahan konfigurasi. Misalnya, itu bisa bertahan melaluionRetainCustomNonConfigurationInstance()
, atau lingkup Mortar.Untuk info lebih lanjut tentang berlangganan, lihat panduan oleh Google . Juga silakan lihat situs ini tentang metode penyediaan dan juga bagian ketergantungan komponen ) dan di sini .
Untuk membuat cakupan khusus, Anda harus menentukan anotasi pengualifikasi cakupan:
Untuk membuat subskop, Anda perlu menentukan cakupan pada komponen Anda, dan menentukan
ApplicationComponent
sebagai ketergantungannya. Jelas Anda juga perlu menentukan subskop pada metode penyedia modul.Dan
Harap diperhatikan bahwa hanya satu komponen cakupan yang dapat ditentukan sebagai dependensi. Anggap saja persis seperti bagaimana multiple inheritance tidak didukung di Java.
+2.) Tentang
@Subcomponent
: pada dasarnya, cakupan@Subcomponent
dapat menggantikan ketergantungan komponen; tetapi alih-alih menggunakan builder yang disediakan oleh pemroses anotasi, Anda harus menggunakan metode pabrik komponen.Jadi ini:
Menjadi ini:
Dan ini:
Menjadi ini:
+3.): Silakan periksa pertanyaan Stack Overflow lainnya tentang Dagger2 juga, mereka memberikan banyak info. Misalnya, struktur Dagger2 saya saat ini ditentukan dalam jawaban ini .
Terima kasih
Terima kasih untuk panduan di Github , TutsPlus , Joe Steele , Froger MCS dan Google .
Juga untuk panduan migrasi langkah demi langkah ini yang saya temukan setelah menulis posting ini.
Dan untuk penjelasan ruang lingkup oleh Kirill.
Lebih banyak informasi di dokumentasi resmi .
sumber
DaggerApplicationComponent
dibuat secara otomatis oleh APT pada build, tapi saya akan menambahkannya.Panduan untuk Dagger 1.x :
Langkah-langkahnya adalah sebagai berikut:
1.) tambahkan
Dagger
kebuild.gradle
file untuk dependensiJuga, tambahkan
packaging-option
untuk mencegah kesalahan tentangduplicate APKs
.2.) membuat
Injector
kelas untuk menanganiObjectGraph
.3.) Buat
RootModule
untuk menghubungkan modul masa depan Anda bersama-sama. Harap dicatat bahwa Anda harus memasukkaninjects
untuk menentukan setiap kelas di mana Anda akan menggunakan@Inject
anotasi, karena jika tidak, Dagger melemparRuntimeException
.4.) Jika Anda memiliki sub-modul lain dalam modul Anda yang ditentukan di Root, buat modul untuk itu:
5.) membuat modul daun yang menerima dependensi sebagai parameter konstruktor. Dalam kasus saya, tidak ada ketergantungan melingkar, jadi saya tidak tahu apakah Dagger dapat menyelesaikannya, tetapi saya merasa itu tidak mungkin. Parameter konstruktor juga harus disediakan di Module by Dagger, jika Anda menentukannya
complete = false
maka bisa juga di Module lain.6.) Perluas
Application
dan inisialisasi fileInjector
.7.) Di Anda
MainActivity
, panggil Injector dalamonCreate()
metode tersebut.8.) Gunakan
@Inject
diMainActivity
.Jika Anda mendapatkan error
no injectable constructor found
, pastikan Anda tidak melupakan@Provides
anotasi tersebut.sumber
Android Bootstrap
. Jadi, penghargaan untuk mereka karena telah memahaminya. Penggunaan solusiDagger v1.2.2
.dagger-compiler
harusprovided
jika tidak maka akan dimasukkan ke dalam aplikasi, dan itu di bawah lisensi GPL.