最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Koin 注入入門(mén)指南

 更新時(shí)間:2026年01月10日 09:19:34   作者:stevenzqzq  
本文介紹了Koin依賴(lài)注入框架的入門(mén)知識(shí),適合Android新手和從Dagger/Hilt轉(zhuǎn)到Koin的開(kāi)發(fā)者,文章涵蓋了Koin的核心概念、最常用的注入方式、在A(yíng)ndroid中如何使用Koin以及常見(jiàn)錯(cuò)誤,通過(guò)一個(gè)完整示例,讀者可以快速上手Koin,感興趣的朋友跟隨小編一起看看吧

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)KoinDagger / 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)文章

最新評(píng)論

长宁县| 肃宁县| 南充市| 都安| 澜沧| 澎湖县| 定襄县| 浪卡子县| 鱼台县| 北辰区| 宁夏| 多伦县| 岫岩| 达尔| 兴业县| 乌拉特中旗| 台北县| 搜索| 宜君县| 南昌市| 右玉县| 西安市| 万年县| 陵川县| 秭归县| 土默特左旗| 旺苍县| 廊坊市| 平潭县| 黄大仙区| 陆川县| 嘉峪关市| 四川省| 招远市| 东辽县| 平舆县| 五指山市| 天长市| 吴旗县| 安图县| 富阳市|