close

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
 

 

 

 

 

 

 

 

 

 

 

 

arrow
arrow
    全站熱搜

    JBLin 發表在 痞客邦 留言(1) 人氣()