kotlin dagger.android 小例子
開發環境
版本
Android studio 3.5
Gradle 5.4.1
dagger2是幹嘛呢?
dagger2 其實就是類似springmvc中的AOP面向切面編程,主要作用方便解耦, 通過自定義註解和apt插件在適當的時間創建對象和
銷燬對象。
源碼
下面的用一個簡單小例子,展示下kotlin+dagger2的使用
gradle配置
- 主項目
build.gradle 加入 apply plugin: 'kotlin-kapt'
- 需要的依賴
/* Dagger 2 */
implementation 'com.google.dagger:dagger:2.24'
implementation 'com.google.dagger:dagger-android-support:2.24'
kapt 'com.google.dagger:dagger-compiler:2.24'
kapt 'com.google.dagger:dagger-android-processor:2.24'
kotlin代碼
- User
/**
* 構造方法添加 @Inject 註解
*/
data class User @Inject constructor(val name: String, val age: Int)
- UserModule
@Module
object BeanModule {
@JvmStatic
@Provides
fun name() = "xxx"
@JvmStatic
@Provides
@Named("ag")
fun age1() = 1234
@JvmStatic
@Provides
@Named("ags")
fun age22() = 2132
@JvmStatic
@Provides
fun injectUser(
name: String, //String 類型 會對應找當前Module中String類型,賦值
@Named("ag") age: Int //當一個module內有多個相同類型時候,可以通過Named註解進行區分
): User =
User(name, age)
}
- ActivityModule
@Module
abstract class ActivityModule {
@ContributesAndroidInjector(
modules = [
BeanModule::class
]
)
abstract fun injectScrollingActivity(): ScrollingActivity
}
- ApplicationComponent 接口,創建完之後需要build下工程,通過kapt插件創建DaggerApplicationComponent
//單例
@Singleton
@Component(
modules = [ActivityModule::class,
AndroidSupportInjectionModule::class
]
)
interface ApplicationComponent : AndroidInjector<App> {
//這個可以不用寫,生成的時候直接用build 不用create
// @Component.Builder
// abstract class Builder : AndroidInjector.Builder<App>()
}
- App
/**
* Application 需要繼承 DaggerApplication
*/
class App : DaggerApplication() {
/**
* @see DaggerApplicationComponent 是 ApplicationComponent接口的實現類
*/
override fun applicationInjector():
AndroidInjector<out DaggerApplication> = DaggerApplicationComponent.builder().build()
}
- 在ScrollingActivity使用
class ScrollingActivity : DaggerAppCompatActivity() {
@Inject
lateinit var user: User
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scrolling)
//使用user
Log.e("onCreate", "user $user")
}
}