Android開發(fā) Kotlin + Dagger-android

文筆不好,有不懂的屬性可以去百度橡淑,這里不作過多解釋

導(dǎo)入

沒啥好說的,需要注意的就是別忘了加上

  apply plugin: 'kotlin-kapt'

  kapt {
      generateStubs = true
  }

在dependencies里 (我這里用的2.13 有最新就用最新的吧)

    //dagger2
    implementation 'com.google.dagger:dagger:2.13'
    kapt 'com.google.dagger:dagger-compiler:2.13'
    implementation 'com.google.dagger:dagger-android:2.13'
    implementation 'com.google.dagger:dagger-android-support:2.13'
    kapt 'com.google.dagger:dagger-android-processor:2.13'
進(jìn)入主題

Module
這里寫了個ActivityBuilderModule

@Module
abstract class ActivityBuilderModule {

    @Singleton
    @Binds
    abstract fun application(app: MyApplication): Context

    @ContributesAndroidInjector(modules = arrayOf(MainModule::class))
    abstract fun bindMainActivity(): MainActivity

}

/**
 *  Activity里的每一個Fragment,要在module里面如下聲明
 *  并且Fragment還有用@Inject標(biāo)注其無參構(gòu)造方法
 */

@Module
abstract class MainModule {

    @Binds
    abstract fun bindMainFragment(mainFragment: MainFragment): Fragment

    @ContributesAndroidInjector
    abstract fun bindMainFragment(): MainFragment

}

Component
只需創(chuàng)建一個實(shí)例岭埠,有子組件可以寫在modules里
AndroidSupportInjectionModule 這個module是來自Dagger.Android 用來幫助生成和定位SupComponents(子組件)

@Singleton
@Component(modules = arrayOf(AndroidSupportInjectionModule::class, ActivityBuilderModule::class))
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): AppComponent.Builder

        fun build(): AppComponent
    }

    fun inject(instance: MyApplication)
}

別忘了Make Project
Component會在自己生成一個 (Dagger+你的Component),本文的是DaggerAppComponent蔚鸥,然后在Application創(chuàng)建單例的Component

Application

1.你可以直接繼承 DaggerApplication
2.如本文惜论,繼承HasActivityInjector實(shí)現(xiàn),否則編譯不過

    @Inject
    lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingActivityInjector
    }

繼承HasActivityInjector

class MyApplication : Application() , HasActivityInjector {

    @Inject
    lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingActivityInjector
    }

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder().application(this)
                .build().inject(this)
    }

}
注入Activity和Fragment

1.你可以直接繼承DaggerAppCompatActivity止喷、DaggerFragment
2.創(chuàng)建BaseActivity馆类、BaseFragment 然后繼承...如下文

//BaseActivity
abstract class BaseActivity : AppCompatActivity(), HasFragmentInjector, HasSupportFragmentInjector {

    @Inject
    lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
    @Inject
    lateinit var frameworkFragmentInjector: DispatchingAndroidInjector<android.app.Fragment>

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return supportFragmentInjector
    }

    override fun fragmentInjector(): AndroidInjector<android.app.Fragment> {
        return frameworkFragmentInjector
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
}

//BaseFragment
abstract class BaseFragment : Fragment(), HasSupportFragmentInjector {

    @Inject
    lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return childFragmentInjector
    }

    @SuppressWarnings("deprecation")
    override fun onAttach(activity: Activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            // Perform injection here before M, L (API 22) and below because onAttach(Context)
            // is not yet available at L.
            AndroidSupportInjection.inject(this)
        }
        super.onAttach(activity)
    }

    override fun onAttach(context: Context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Perform injection here for M (API 23) due to deprecation of onAttach(Activity).
            AndroidSupportInjection.inject(this)
        }
        super.onAttach(context)
    }

}

Activity
ps:lateinit前不要用private 否則編譯報(bào)錯

class MainActivity : BaseActivity() {

    @Inject
    lateinit var mMainFragment: MainFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        supportFragmentManager
                .beginTransaction()
                .add(R.id.fragment_content, mMainFragment)
                .commit()
    }
}

Fragment
@Inject標(biāo)注其無參構(gòu)造方法

class MainFragment @Inject constructor(): BaseFragment() {

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_main, container, false)
    }

}
總結(jié)坑點(diǎn)
  1. DaggerAppComponent爆紅不要急,Make Project就出來了(如果能順利編譯)
  2. lateinit 前不要用 private 否則編譯報(bào)錯
  3. @Inject標(biāo)注其無參構(gòu)造方法 (@Inject constructor()),然后在Module @Binds
  4. 實(shí)在編譯不過弹谁,再看一下本文 或 看下GitHub上的項(xiàng)目
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乾巧,一起剝皮案震驚了整個濱河市句喜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟于,老刑警劉巖咳胃,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旷太,居然都是意外死亡展懈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門供璧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來存崖,“玉大人,你說我怎么就攤上這事睡毒±淳澹” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵演顾,是天一觀的道長违寞。 經(jīng)常有香客問我,道長偶房,這世上最難降的妖魔是什么趁曼? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮棕洋,結(jié)果婚禮上挡闰,老公的妹妹穿的比我還像新娘。我一直安慰自己掰盘,他們只是感情好摄悯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愧捕,像睡著了一般奢驯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上次绘,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天瘪阁,我揣著相機(jī)與錄音,去河邊找鬼邮偎。 笑死管跺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禾进。 我是一名探鬼主播豁跑,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泻云!你這毒婦竟也來了艇拍?” 一聲冷哼從身側(cè)響起狐蜕,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卸夕,沒想到半個月后馏鹤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇哆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勃救。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍讨。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒙秒,靈堂內(nèi)的尸體忽然破棺而出勃黍,到底是詐尸還是另有隱情,我是刑警寧澤晕讲,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布覆获,位于F島的核電站,受9級特大地震影響瓢省,放射性物質(zhì)發(fā)生泄漏弄息。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一勤婚、第九天 我趴在偏房一處隱蔽的房頂上張望摹量。 院中可真熱鬧,春花似錦馒胆、人聲如沸缨称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睦尽。三九已至,卻和暖如春型雳,著一層夾襖步出監(jiān)牢的瞬間当凡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工纠俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宁玫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓柑晒,卻偏偏與公主長得像欧瘪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匙赞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350