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

文筆不好,有不懂的屬性可以去百度,這里不作過(guò)多解釋

導(dǎo)入

沒(méi)啥好說(shuō)的,需要注意的就是別忘了加上

  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
這里寫(xiě)了個(gè)ActivityBuilderModule

@Module
abstract class ActivityBuilderModule {

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

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

}

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

@Module
abstract class MainModule {

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

    @ContributesAndroidInjector
    abstract fun bindMainFragment(): MainFragment

}

Component
只需創(chuàng)建一個(gè)實(shí)例,有子組件可以寫(xiě)在modules里
AndroidSupportInjectionModule 這個(gè)module是來(lái)自Dagger.Android 用來(lái)幫助生成和定位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會(huì)在自己生成一個(gè) (Dagger+你的Component),本文的是DaggerAppComponent,然后在Application創(chuàng)建單例的Component

Application

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

    @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)錯(cuò)

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)注其無(wú)參構(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就出來(lái)了(如果能順利編譯)
  2. lateinit 前不要用 private 否則編譯報(bào)錯(cuò)
  3. @Inject標(biāo)注其無(wú)參構(gòu)造方法 (@Inject constructor()),然后在Module @Binds
  4. 實(shí)在編譯不過(guò),再看一下本文 或 看下GitHub上的項(xiàng)目
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容