前言:本文不會介紹Dagger2如何使用,假設大家已經能夠在java項目中使用dagger2
今天在kotlin項目中配置了一下dagger2,發現和java中略有不同,寫篇文章記錄一下。
項目配置
首先,我們需要在gradle file裏面配置kapt。如果在java中使用過dagger,肯定知道apt,apt是一個gradle插件,協助Android Studio 處理annotation processors。dagger就是依靠編譯時註解生成輔助類,在需要時來get到你需要的object的。kapt就是apt的kotlin版本。
1.需要在build.gradle中加入,放到denpencies section上面就可以
kapt {
generateStubs = true
}
2.加入kotlin plugin
apply plugin: 'kotlin-kapt'
3.加入denpencies
//dagger2
kapt 'com.google.dagger:dagger-compiler:2.5'
implementation 'com.google.dagger:dagger:2.5'
以上,就是需要的配置
配置module和component
先從module開始
新建一個AppModule,這裏我們提供兩個對象,一個是application context,一個是appManager對象
@Module
class AppModule(private val app: BaseApp) {
@Singleton
@Provides
fun provideApplicationContext():Context = app.applicationContext
@Singleton
@Provides
fun provideAppManager():AppManager= AppManager()
}
實現一個component,加入我們剛纔創建的module
@Singleton
@Component(modules = [(AppModule::class)])
interface AppComponent {
fun inject(baseApp: BaseApp)
fun inject(mainActivity: MainActivity)
}
在Application類中,初始化dagger component。在這之前,需要make project一下,以便dagger生成DaggerAppComponent這個類。如下代碼,定義appComponent爲companion object,類似java中的static對象,並且使用了lateinit關鍵字,自行稍後init。接着在initDagger方法appComponent
class BaseApp : Application() {
companion object {
//platformStatic allow access it from java code
@JvmStatic lateinit var appComponent: AppComponent
}
override fun onCreate() {
super.onCreate()
initDagger()
this.registerActivityLifecycleCallbacks(ActivityLifeCycle())
}
private fun initDagger(){
appComponent = DaggerAppComponent.builder().appModule(AppModule(this)).build()
}
}
在MainActivity中使用注入對象,這就比較簡單了,inject注入對象,並且在onCreate方法中inject這個activity,這樣就可以使用appManager這個對象了。
class MainActivity : AppCompatActivity() {
@Inject
lateinit var appManager:AppManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
BaseApp.appComponent.inject(this)
}
}