Android Koin 注入入門(mén)指南
Android Koin 注入入門(mén)教程
適合人群
- Android 新手 / 剛接觸 DI
- 從 Dagger/Hilt 轉(zhuǎn) Koin
- 多模塊項(xiàng)目 / 車(chē)機(jī)項(xiàng)目開(kāi)發(fā)者
目標(biāo)
- 理解「為什么要用 Koin」
- 掌握 80% 常用注入方式
- 避免 80% 新手必踩坑
一、什么是依賴(lài)注入(Dependency Injection)
1.1 不用 DI 會(huì)怎樣?
class MusicViewModel {
private val repository = MusicRepository()
}問(wèn)題
- 類(lèi)強(qiáng)依賴(lài)具體實(shí)現(xiàn)
- 無(wú)法替換 / 無(wú)法測(cè)試
- 多模塊會(huì)產(chǎn)生循環(huán)依賴(lài)
1.2 用 DI 后
class MusicViewModel(
private val repository: MusicRepository
)
- ViewModel 只依賴(lài)接口
- 具體實(shí)現(xiàn)由外部“注入”
- 解耦、可測(cè)試、可擴(kuò)展
二、為什么選擇 Koin?
| 對(duì)比項(xiàng) | Koin | Dagger / Hilt |
|---|---|---|
| 學(xué)習(xí)成本 | ? 低 | 高 |
| 編譯速度 | 快 | 慢 |
| 寫(xiě)法 | Kotlin DSL | 注解 + 生成代碼 |
| 多模塊靈活性 | 高 | 中 |
| 車(chē)機(jī)項(xiàng)目 | ? 非常合適 | 偏重 |
一句話(huà):
Koin = Kotlin 工程師友好的 DI 框架
三、Koin 的三大核心概念
3.1 Module(模塊)
告訴 Koin:如何創(chuàng)建對(duì)象
val appModule = module {
single { MusicRepository() }
}
3.2 Component(使用注入的地方)
class MusicViewModel(
private val repository: MusicRepository
)
3.3 Koin 容器
在 Application 中啟動(dòng)
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MainApplication)
modules(appModule)
}
}
}四、最常用的注入方式(重點(diǎn))
4.1single—— 單例(最常用)
single { MusicRepository() }- 整個(gè) App 只有一個(gè)實(shí)例
- 適合 Repository / Manager / Listener
4.2factory—— 每次新建
factory { PlayerController() }
- 每次 inject 都創(chuàng)建新對(duì)象
- 不適合 Listener
4.3singleOf—— 推薦寫(xiě)法 ?
singleOf(::MusicRepository)
優(yōu)勢(shì):
- 自動(dòng)解析構(gòu)造函數(shù)參數(shù)
- 寫(xiě)法簡(jiǎn)潔
- 官方推薦
五、如何在 Android 中注入?
5.1 在 Activity / Fragment 中
class MainActivity : AppCompatActivity() {
private val repository: MusicRepository by inject()
}5.2 在 ViewModel 中(推薦)
class MusicViewModel(
private val repository: MusicRepository
) : ViewModel()Module 中:
viewModel {
MusicViewModel(get())
}5.3 在普通類(lèi)中(KoinComponent)
class PlayerManager : KoinComponent {
private val repository: MusicRepository by inject()
}六、接口 + 實(shí)現(xiàn)的標(biāo)準(zhǔn)寫(xiě)法
interface MusicRepository class MusicRepositoryImpl : MusicRepository
Koin 配置:
single<MusicRepository> {
MusicRepositoryImpl()
}注入使用:
private val repository: MusicRepository by inject()
七、Android 多模塊項(xiàng)目中的 Koin
7.1 模塊拆分示例
app ├── feature-localmusic ├── data ├── domain └── base
每個(gè)模塊都有自己的 Koin module:
val dataModule = module { ... }
val domainModule = module { ... }
在 Application 中統(tǒng)一加載:
startKoin {
modules(
appModule,
dataModule,
domainModule
)
}八、新手必踩的 5 個(gè)坑(必看)
? 1?? 忘了加模塊
modules(appModule) // 少了 dataModule
?? 直接導(dǎo)致 NoDefinitionFoundException
? 2?? Listener 用了 factory
factory { PlayerStatusListener() } // 錯(cuò)?? 會(huì)被重復(fù)注冊(cè)
? 應(yīng)使用:
single { PlayerStatusListener() }? 3??single { MyClass }少了括號(hào)
single { MyClass } // 錯(cuò)必須:
single { MyClass() }
? 4?? Startup 順序錯(cuò)誤
- inject 發(fā)生在
startKoin之前 - 常見(jiàn)于
androidx.startup
?? 直接崩潰
? 5?? 多進(jìn)程沒(méi)考慮
- 車(chē)機(jī)項(xiàng)目常見(jiàn)
- 每個(gè)進(jìn)程都會(huì)啟動(dòng) Koin
?? 單例 ≠ 全局唯一
九、一個(gè)完整可運(yùn)行示例
AppModule.kt
val appModule = module {
singleOf(::MusicRepository)
viewModel { MusicViewModel(get()) }
}Application.kt
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MainApplication)
modules(appModule)
}
}
}使用
class MusicFragment : Fragment() {
private val viewModel: MusicViewModel by viewModel()
}十、總結(jié)(記住這 3 句話(huà))
1?? Koin 不是魔法,只是對(duì)象工廠(chǎng)
2?? single / factory 決定的是生命周期
3?? Listener / Manager 一定要 single
到此這篇關(guān)于A(yíng)ndroid Koin 注入入門(mén)教程的文章就介紹到這了,更多相關(guān)Android Koin 注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例
這篇文章主要為大家介紹了Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android自定義View實(shí)現(xiàn)圓形漸變多點(diǎn)的加載框效果
自定義View是Android開(kāi)發(fā)中的一項(xiàng)重要技術(shù),允許開(kāi)發(fā)者創(chuàng)建滿(mǎn)足特定需求的圖形用戶(hù)界面,這篇文章主要介紹了Android自定義View實(shí)現(xiàn)圓形漸變多點(diǎn)的加載框效果,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
android 通過(guò)MediaRecorder實(shí)現(xiàn)簡(jiǎn)單的錄音示例
本篇文章中主要介紹了android 通過(guò)MediaRecorder實(shí)現(xiàn)簡(jiǎn)單的錄音示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
簡(jiǎn)述Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法
本篇文章主要對(duì)Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進(jìn)行介紹,相信對(duì)大家學(xué)習(xí)會(huì)有很好的幫助,需要的朋友一起來(lái)看下吧2016-12-12
Android實(shí)現(xiàn)用戶(hù)登錄記住密碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)用戶(hù)登錄記住密碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Android手機(jī)聯(lián)系人帶字母索引的快速查找
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)聯(lián)系人帶字母索引的快速查找實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-03-03
android dialog邊框去除白色邊框?qū)崿F(xiàn)思路及代碼
android dialog邊框含有白色真是美中不足啊,本文將介紹如何去除白色邊框,有思路及代碼,感興趣的朋友可以了解下2013-01-01

