目录- Android Koin 注入入门教程
- 一、什么是依赖注入(Dependency Injection)
- 1.1 不用 DI 会怎样?
- 问题
- 1.2 用 DI 后
- 二、为什么选择 Koin?
- 三、Koin 的三大核心概念
- 3.1 Module(模块)
- 3.2 Component(使用注入的地方)
- 3.3 Koin 容器
- 四、最常用的注入方式(重点)
- 4.1single—— 单例(最常用)
- 4.2factory—— 每次新建
- 4.3singleOf—— 推荐写法 ⭐
- 五、如何在 Android 中注入?
- 5.1 在 Activity / Fragment 中
- 5.2 在 ViewModel 中(推荐)
- 5.3 在普通类中(KoinComponent)
- 六、接口 + 实现的标准写法
- 七、Android 多模块项目中的 Koin
- 八、新手必踩的 5 个坑(必看)
- ❌ 1️⃣ 忘了加模块
- ❌ 2️⃣ Listener 用了 factory
- ❌ 3️⃣single { MyClass }少了括号
- ❌ 4️⃣ Startup 顺序错误
- ❌ 5️⃣ 多进程没考虑
- 九、一个完整可运行示例
- AppModule.kt
- Application.kt
- 使用
- 十、总结(记住这 3 句话)
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?
| 对比项 | Koin | Dagger / 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 }少了括号
必须:
❌ 4️⃣ Startup 顺序错误
- inject 发生在
startKoin 之前 - 常见于
androidx.startup
👉 直接崩溃
❌ 5️⃣ 多进程没考虑
👉 单例 ≠ 全局唯一
九、一个完整可运行示例
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中三种注入事件方法比较
|