Android Koin2基本使用的那件事兒
首先什么是KOIN?
適用于 Kotlin 開發(fā)人員的實用輕量級依賴注入框架。
用純 Kotlin 編寫,僅使用功能分辨率:無代理,無代碼生成,無反射。
PS:KOIN 支持 Kotion 和 Java
Koin 怎么配置?
本文主要講解 Koin (2.0.1) 在AndroidX中的使用,所以直接添加 koin-android 依賴
首先添加 Koin Android 基本依賴
// Koin for Android implementation "org.koin:koin-android:$koin_version"
如果需要使用到 Scope(范圍) 控制,則依賴 koin-androidx-scope
// Koin AndroidX Scope features implementation "org.koin:koin-androidx-scope:$koin_version"
如果項目中使用到ViewModel,那么毫不猶豫依賴 koin-androidx-viewmodel
// Koin AndroidX ViewModel features implementation "org.koin:koin-androidx-viewmodel:$koin_version"
既然使用Kotlin,擴展功能怎么能少呢?添加 koin-androidx-ext
// Koin AndroidX Experimental features implementation "org.koin:koin-androidx-ext:$koin_version"
Koin 怎么使用?
Koin 入門使用相當容易,學會下面幾個關鍵詞就 OK 了,跟著來看看哦~
factory
今天 Activity 需要一個 Girl(嗯~,可能是幾個),那我們就創(chuàng)建個依賴對象使用 Koin 注入給它,這時我需要每次都給它個新的(使用factory):
val girlModule = module {
factory {
Girl()
}
}
依賴對象有了,我得讓 Koin 知道,所以需要在我們的 Application 初始化:
override fun onCreate() {
super.onCreate()
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@App)
androidFileProperties()
modules(listOf(girlModule))
}
}
現(xiàn)在好像什么都有,接下來當 Activity 需要時該怎么給它呢?看 Activity 代碼:
// 注釋掉的是另一種寫法
class Simple1Activity : AppCompatActivity() {
private val girl by inject<Girl>()
//private lateinit var girl: Girl
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sample1)
//girl = get()
ivImage.setImageResource(girl.getGirl())
}
}

看臉都是一個人啊!怎么知道每次都是個新 Girl 呢?直接檢查 Girl 的身份證:
System.out: ---->com.joker.koin.model.Girl@a5b751b
System.out: ---->com.joker.koin.model.Girl@727e094
System.out: ---->com.joker.koin.model.Girl@e005b30
K,原來是3胞胎...
single
現(xiàn)在都什么時代了,不能給它享受多個 Girl 啊,那就把 factory 換成 single,動手試試檢查 Girl 證件:
val girlModule = module {
single {
Girl()
}
}
System.out: ---->com.joker.koin.model.Girl@48146b8
System.out: ---->com.joker.koin.model.Girl@48146b8
System.out: ---->com.joker.koin.model.Girl@48146b8
如此簡單的我們就實現(xiàn)了單例。什么?同時要2個 Girl,還要不同類型且要是固定的。沒問題我們有 Qualifier 和 Definition
val girlModule = module {
single(named("girl1")) { (type: String) ->
Girl().apply {
this.type = type
}
}
single(named("girl2")) { (type: String) ->
Girl().apply {
this.type = type
}
}
}
看看 Activity 怎么樣了:
class Simple2Activity : AppCompatActivity() {
private val girl1 by inject<Girl>(named("girl1")) { parametersOf("可愛") }
private val girl2 by inject<Girl>(named("girl2")) { parametersOf("性感") }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sample1)
ivImage.setImageResource(girl1.getGirl())
ivImage.postDelayed({
ivImage.setImageResource(girl2.getGirl())
}, 3000)
}
}

scope
scope 是個什么東西呢?我理解是使用范圍,類似于生命周期,我們可以控制它的存活范圍。
來個其他的栗子換個口味,先奉上效果圖:

val girlModule = module {
scope(named("scope")) {
scoped {
ScopeEntity()
}
}
}
scope 必須得指定 Qualifier,創(chuàng)建了 scope 依賴。接下來就是 createScope 和 bindScope,在這里設置了默認值 "Scope1Activity":
class Scope1Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scope1)
//創(chuàng)建 scope 需要指定 id 和 qualifier,getScope 需要id
val scope1 = getKoin().createScope("scope1", named("scope"))
//默認綁定onDestory
bindScope(scope1)
scope1.get<ScopeEntity>().text = "Scope1Activity"
tvText.text = scope1.get<ScopeEntity>().text
btn.setOnClickListener {
startActivity(Intent(this, Scope2Activity::class.java))
}
}
override fun onResume() {
super.onResume()
tvText.text = getKoin().getScope("scope1").get<ScopeEntity>().text
}
}
在 Scope2Activity 使用 getScope 獲取并修改新值 "Scope2Activity":
class Scope2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scope1)
val scope1 = getKoin().getScope("scope1")
scope1.get<ScopeEntity>().text = "Scope2Activity"
tvText.text = scope1.get<ScopeEntity>().text
}
}
在 Scope1Activity 執(zhí)行 onDestory 時,幫定在其中的 scope 就已經(jīng) close 了,這時再 getScope 將拋出異常:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//驗證 scope銷毀 延時是為了保證 Scope1Activity 已經(jīng)執(zhí)行 onDestory
scope.postDelayed({
scope.text = try {
getKoin().getScope("scope1").get<ScopeEntity>().text
} catch (e: Exception) {
"scope back"
}
}, 3000)
}
描述下流程:
- 在 Scope1Activity 創(chuàng)建了 scope1 設置值,并且綁定(bindScope)了范圍。
- 跳轉到 Scope2Activity 先顯示原有值,修改后返回。由于 Scope1Activity 沒有銷毀,所以在 onResume 顯示了新值。
- 返回 MainActivity ,由于 scope 特性,此時已經(jīng)獲取不到相應的值了。
Demo 地址: github.com/joker-fu/sa…(本地下載)
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
搭建mac使用Charles抓包安卓app環(huán)境配置過程
這篇文章主要為大家介紹了mac使用Charles抓包,安卓app環(huán)境搭建的配置過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02
解決android studio 打開java文件 內(nèi)容全變了的問題
這篇文章主要介紹了解決android studio 打開java文件 內(nèi)容全變了的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android UI控件RatingBar實現(xiàn)自定義星星評分效果
這篇文章主要為大家詳細介紹了Android UI控件RatingBar實現(xiàn)自定義星星評分效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android框架Volley使用之Post請求實現(xiàn)方法
這篇文章主要介紹了Android框架Volley使用之Post請求實現(xiàn)方法,,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
Android Studio升級到3.0 Terminal 中文顯示異常解決
本篇文章主要介紹了Android Studio升級到3.0 Terminal 中文顯示異常解決,非常具有實用價值,需要的朋友可以參考下2017-10-10

