查看: 88|回复: 0

[教程] Android Koin 注入入门指南

[复制链接]

1

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-5-31
发表于 2026-1-10 09:19:34 | 显示全部楼层 |阅读模式

Android Koin 注入入门教程

适合人群

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

目标

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

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

1.1 不用 DI 会怎样?

class MusicViewModel {
    private val repository = MusicRepository()
}

问题

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

1.2 用 DI 后

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

二、为什么选择 Koin?

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

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

三、Koin 的三大核心概念

3.1 Module(模块)

告诉 Koin:如何创建对象

val appModule = module {
    single { MusicRepository() }
}

3.2 Component(使用注入的地方)

class MusicViewModel(
    private val repository: MusicRepository
)

3.3 Koin 容器

在 Application 中启动

class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MainApplication)
            modules(appModule)
        }
    }
}

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

4.1single—— 单例(最常用)

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

4.2factory—— 每次新建

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

4.3singleOf—— 推荐写法 ⭐

singleOf(::MusicRepository)

优势:

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

五、如何在 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 在普通类中(KoinComponent)

class PlayerManager : KoinComponent {
    private val repository: MusicRepository by inject()
}

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

interface MusicRepository
class MusicRepositoryImpl : MusicRepository

Koin 配置:

single<MusicRepository> {
    MusicRepositoryImpl()
}

注入使用:

private val repository: MusicRepository by inject()

七、Android 多模块项目中的 Koin

7.1 模块拆分示例

app
├── feature-localmusic
├── data
├── domain
└── base

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

val dataModule = module { ... }
val domainModule = module { ... }

在 Application 中统一加载:

startKoin {
    modules(
        appModule,
        dataModule,
        domainModule
    )
}

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

❌ 1️⃣ 忘了加模块

modules(appModule) // 少了 dataModule

👉 直接导致 NoDefinitionFoundException

❌ 2️⃣ Listener 用了 factory

factory { PlayerStatusListener() } // 错

👉 会被重复注册
✅ 应使用:

single { PlayerStatusListener() }

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

single { MyClass } // 错

必须:

single { MyClass() }

❌ 4️⃣ Startup 顺序错误

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

👉 直接崩溃

❌ 5️⃣ 多进程没考虑

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

👉 单例 ≠ 全局唯一

九、一个完整可运行示例

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()
}

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

1️⃣ Koin 不是魔法,只是对象工厂
2️⃣ single / factory 决定的是生命周期
3️⃣ Listener / Manager 一定要 single

到此这篇关于Android Koin 注入入门教程的文章就介绍到这了,更多相关Android Koin 注入内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!

您可能感兴趣的文章:
  • Android Koin2基本使用的那件事儿
  • Android依赖注入框架Dagger2的使用方法
  • Android ButterKnife依赖注入框架使用教程
  • Android Hilt依赖注入的使用讲解
  • Android中WebView无法后退和js注入漏洞的解决方案
  • Android中三种注入事件方法比较
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部