Android Koin 注入入门教程

Android Koin 注入入门教程

适合人群

  • Android 新手 / 刚接触 DI
  • 从 Dagger/Hilt 转 Koin
  • 多模块项目 / 车机项目开发者

目标

  • 理解「为什么要用 Koin」
  • 掌握 80% 常用注入方式
  • 避免 80% 新手必踩坑

一、什么是依赖注入(Dependency Injection)

1.1 不用 DI 会怎样?

kotlin 复制代码
class MusicViewModel {

    private val repository = MusicRepository()
}

问题

  • 类强依赖具体实现
  • 无法替换 / 无法测试
  • 多模块会产生循环依赖

1.2 用 DI 后

kotlin 复制代码
class MusicViewModel(
    private val repository: MusicRepository
)
  • ViewModel 只依赖接口
  • 具体实现由外部"注入"
  • 解耦、可测试、可扩展

二、为什么选择 Koin?

对比项 Koin Dagger / Hilt
学习成本 ⭐ 低 高
编译速度 快 慢
写法 Kotlin DSL 注解 + 生成代码
多模块灵活性 高 中
车机项目 ⭐ 非常合适 偏重

一句话 :

Koin = Kotlin 工程师友好的 DI 框架


三、Koin 的三大核心概念

3.1 Module(模块)

告诉 Koin:如何创建对象

kotlin 复制代码
val appModule = module {
    single { MusicRepository() }
}

3.2 Component(使用注入的地方)

kotlin 复制代码
class MusicViewModel(
    private val repository: MusicRepository
)

3.3 Koin 容器

在 Application 中启动

kotlin 复制代码
class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        startKoin {
            androidContext(this@MainApplication)
            modules(appModule)
        }
    }
}

四、最常用的注入方式(重点)

4.1 single ------ 单例(最常用)

kotlin 复制代码
single { MusicRepository() }
  • 整个 App 只有一个实例
  • 适合 Repository / Manager / Listener

4.2 factory ------ 每次新建

kotlin 复制代码
factory { PlayerController() }
  • 每次 inject 都创建新对象
  • 不适合 Listener

4.3 singleOf ------ 推荐写法 ⭐

kotlin 复制代码
singleOf(::MusicRepository)

优势:

  • 自动解析构造函数参数
  • 写法简洁
  • 官方推荐

五、如何在 Android 中注入?

5.1 在 Activity / Fragment 中

kotlin 复制代码
class MainActivity : AppCompatActivity() {

    private val repository: MusicRepository by inject()
}

5.2 在 ViewModel 中(推荐)

kotlin 复制代码
class MusicViewModel(
    private val repository: MusicRepository
) : ViewModel()

Module 中:

kotlin 复制代码
viewModel {
    MusicViewModel(get())
}

5.3 在普通类中(KoinComponent)

kotlin 复制代码
class PlayerManager : KoinComponent {

    private val repository: MusicRepository by inject()
}

六、接口 + 实现的标准写法

kotlin 复制代码
interface MusicRepository

class MusicRepositoryImpl : MusicRepository

Koin 配置:

kotlin 复制代码
single<MusicRepository> {
    MusicRepositoryImpl()
}

注入使用:

kotlin 复制代码
private val repository: MusicRepository by inject()

七、Android 多模块项目中的 Koin

7.1 模块拆分示例

复制代码
app
├── feature-localmusic
├── data
├── domain
└── base

每个模块都有自己的 Koin module:

kotlin 复制代码
val dataModule = module { ... }
val domainModule = module { ... }

在 Application 中统一加载:

kotlin 复制代码
startKoin {
    modules(
        appModule,
        dataModule,
        domainModule
    )
}

八、新手必踩的 5 个坑(必看)

❌ 1️⃣ 忘了加模块

kotlin 复制代码
modules(appModule) // 少了 dataModule

👉 直接导致 NoDefinitionFoundException


❌ 2️⃣ Listener 用了 factory

kotlin 复制代码
factory { PlayerStatusListener() } // 错

👉 会被重复注册

✅ 应使用:

kotlin 复制代码
single { PlayerStatusListener() }

❌ 3️⃣ single { MyClass } 少了括号

kotlin 复制代码
single { MyClass } // 错

必须:

kotlin 复制代码
single { MyClass() }

❌ 4️⃣ Startup 顺序错误

  • inject 发生在 startKoin 之前
  • 常见于 androidx.startup

👉 直接崩溃


❌ 5️⃣ 多进程没考虑

  • 车机项目常见
  • 每个进程都会启动 Koin

👉 单例 ≠ 全局唯一


九、一个完整可运行示例

AppModule.kt

kotlin 复制代码
val appModule = module {
    singleOf(::MusicRepository)
    viewModel { MusicViewModel(get()) }
}

Application.kt

kotlin 复制代码
class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        startKoin {
            androidContext(this@MainApplication)
            modules(appModule)
        }
    }
}

使用

kotlin 复制代码
class MusicFragment : Fragment() {

    private val viewModel: MusicViewModel by viewModel()
}

十、总结(记住这 3 句话)

1️⃣ Koin 不是魔法,只是对象工厂

2️⃣ single / factory 决定的是生命周期

3️⃣ Listener / Manager 一定要 single


相关推荐
李子红了时16 分钟前
阿狸舞台APP(安卓端手机EncFS解密+压缩包解压+视频播放)
android·音视频
事圆则缓18 分钟前
Android 使用 Jenkins 实现 CI/CD,并用 SonarQube 建立质量门禁
android·ci/cd·jenkins
其实防守也摸鱼23 分钟前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
李游Leo25 分钟前
HarmonyOS 7 QuickDock 闪控窗开发实录 06:floatView × 回归验收:25轮场景回归、资源基线与发布前收口【鸿蒙心迹】
回归·kotlin·harmonyos
恋猫de小郭25 分钟前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
李游Leo27 分钟前
HarmonyOS 7 DualCart 平行视界适配实录 06:Navigation × 多窗口回归:路由冲突、恢复一致性与性能验收【鸿蒙心迹】
回归·kotlin·harmonyos
ZealSinger15 小时前
Boot4挂起函数丢traceId怎么修
spring boot·kotlin·协程·可观测性
素师良码19 小时前
第5篇:显示驱动必备调试工具浅析
android
维克兜率天19 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
墨天梦20 小时前
B06_XML控件布局与ViewBinding
android·kotlin