Dagger2作為Android的依賴注入主流框架,主要將程式碼的依賴交由框架自動媒合,降低依賴程度,但缺點是學習曲線偏高。
架構是將要提供注入的物件放進Module裡面,將Module放進Component做生命週期的控制,並在要使用的class內做物件注入instance即可使用
1.第一步驟:在gradle引用Library,(範例程式碼使用lifecycle的ViewModel,這邊一併引用進來)
apply plugin: 'kotlin-kapt'
//dagger implementation 'com.google.dagger:dagger:2.24' kapt 'com.google.dagger:dagger-compiler:2.24' implementation 'com.google.dagger:dagger-android:2.24' implementation 'com.google.dagger:dagger-android-support:2.24' kapt 'com.google.dagger:dagger-android-processor:2.24' //lifecycle implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
2.第二步驟:創建Module提供物件供注入使用(返回的物件是要讓其他class注入使用,如果有兩個function返回相同物件的話,需要另外定義)
import dagger.Module import dagger.Provides import javax.inject.Singleton @Module class TestModule { @Singleton @Provides fun getTestUtil1():TestUtil{ return TestUtil() } }
3.第三步驟:將要做inject的Activity進行宣告,就可使用AndroidInject
import dagger.Module import dagger.android.ContributesAndroidInjector @Module abstract class DaggerModule { @ContributesAndroidInjector abstract fun getMainActivity(): MainActivity }
4.第四步驟:創建Component將module放入容器內做統一生命週期管理,並且開一個接口給對應的Application class做inject
import dagger.Component import dagger.android.AndroidInjectionModule import javax.inject.Singleton @Singleton @Component(modules = [TestModule::class, AndroidInjectionModule::class, DaggerModule::class]) interface DaggerComponent { fun inject(application: MyApp?) }
5.第五步驟:創建Application讓應用程式一啟動就將容器啟動,方便給其他物件從容器內注入物件
import android.app.Application import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector import dagger.android.HasAndroidInjector import javax.inject.Inject class MyApp : Application(), HasAndroidInjector { @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any> override fun onCreate() { super.onCreate() DaggerDaggerComponent.create().inject(this) } override fun androidInjector(): AndroidInjector<Any> { return dispatchingAndroidInjector } }
6.第六步驟:Activity做AndroidInjection.inject(this)->這邊搭配DaggerModule的注入接口,將自己注入容器裡面,即可注入容器內所提供的物件
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.lifecycle.ViewModelProvider import dagger.android.AndroidInjection import javax.inject.Inject class MainActivity : AppCompatActivity() { @Inject lateinit var testInjectObject : TestNewUtil override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) AndroidInjection.inject(this) testInjectObject.print() var viewModel = ViewModelProvider(this).get(TestViewModel::class.java) viewModel.toString() } }
7.第七步驟:如果不是Activity、Service、ContentProvider、Fragment的物件,要將自己注入容器內的話要在init做注入
import android.util.Log import javax.inject.Inject class TestNewUtil @Inject constructor() { @Inject lateinit var util: TestUtil fun print() { Log.d("test", "1234:" + util.toString()) } }
8.第八步驟:ViewModel需要ViewModelFactory來做管理
原始碼:https://github.com/a0973378273/kotlinDaggerSample