Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android Koin 注入

Android Koin 注入入门指南

作者:stevenzqzq

本文介绍了Koin依赖注入框架的入门知识,适合Android新手和从Dagger/Hilt转到Koin的开发者,文章涵盖了Koin的核心概念、最常用的注入方式、在Android中如何使用Koin以及常见错误,通过一个完整示例,读者可以快速上手Koin,感兴趣的朋友跟随小编一起看看吧

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
)

二、为什么选择 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() }

4.2factory—— 每次新建

factory { PlayerController() }

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 顺序错误

👉 直接崩溃

❌ 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 注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文