Koin 是什么 Koin 是为 Kotlin 开发者提供的一个实用型轻量级依赖注入框架,采用纯 Kotlin 语言编写而成,仅使用功能解析,无代理、无代码生成、无反射。 Add Jcenter to your repositories if needed repositories { jcenter() } dependencies { // Koin for Android compile "org.koin:koin-android:$koin_version" } 2.比如创建一个HelloRepository来提供一些数据: interface 原理 内联函数 Koin使用了很多的内联函数,它的作用简单来说就是方便进行类型推导,能具体化类型参数。 koin里有一个全局的容器,提供了应用所有所需实例的构造方式,那么当我们需要新建实例的时候,就可以直接从这个容器里面获取到它的构造方式然后拿到所需的依赖,构造出所需的实例就可以了。
增加程序重用 模块功能单一 方便测试 需求变更,减少程序开发 充分的解耦合 Koin是一个Kotin极轻量的依赖注入框架,据官方资料显示,它有一下特点 无代理 无代码生成 无反射。 在app\build.gradle中引入依赖 //koin(依赖注入) implementation "org.koin:koin-androidx-scope:2.0.1" implementation "org.koin:koin-androidx-viewmodel:2.0.1" implementation "org.koin:koin-androidx-ext import org.koin.core.module.Module import org.koin.dsl.module val viewModelModule = module import org.koin.core.module.Module import org.koin.dsl.module val viewModelModule = module
image.png Koin Koin 与 Dagger 以及 Hilt 相比,管理依赖项的方法完全不同。要在 Koin 中注册依赖项,我们不会使用任何注解,因为Koin不会生成任何代码。 Dagger 生成代码来提供依赖,而 Koin 不生成代码,这实际上带来了一些影响。 1. image.png 在 Koin 中的情况有所不同,因为它不会生成任何代码。 另一方面,在 Koin 中,我们可以看到它花费了很多时间。在 Dagger 中注入依赖也比在 Koin 中快一些。 总结 正如我在本文开始时所说的,我这里的目标不是告诉您要使用哪个库。 我在两个不同的大项目中都使用了 Koin 和 Dagger。老实说,我认为选择 Dagger 还是 Koin 并不重要,重要的是能够让你编写干净、简单且易于单元测试的代码。
Koin(轻量级 DI 框架) Koin 是一个基于 Kotlin DSL 的轻量级依赖注入框架,使用运行时反射,简单易上手。 1. 添加依赖 dependencies { implementation "io.insert-koin:koin-android:3.5.0" } 2. { super.onCreate(savedInstanceState) userRepository.getUsers() } } Koin 总结 依赖注入是现代 Android 开发中不可或缺的设计模式,尤其在结合 Hilt 或 Koin 等框架后,能够显著提升开发效率和代码质量。 1. 推荐选择: 项目规模 推荐框架 理由 中大型项目 Hilt Google 官方推荐,编译时安全,与 Android 组件深度集成 小型项目 / 快速原型 Koin 轻量、无注解处理器、Kotlin DSL
本篇是 ardf的第二篇,将介绍基于 DataBinding + Koin 实现的 MVVM 模式页面快速开发框架的使用和详细实现。 Koin 无反射、无代码生成且使用更简单;借助该库可轻松在基于 kotlin 的 Android 应用开发中实现依赖注入,降低代码的耦合性。 更多关于 Koin 的介绍及使用请查阅官方文档:Koin[2] 2. koin,代码如下: val appModule = module { // 将 ViewModel 添加到 koin 依赖 viewModel{ TestViewModel()} } /InsertKoinIO/koin [3] ardf: https://github.com/loongwind/ardf
同时本项目使用Koin作为依赖注入的框架,省去初始化ViewModel、Repository、ViewModelProcider.Factory的过程。 先贴上项目目录,需要关注的是高亮显示的文件(使用Koin省去了Factory类的实现): [image.png] ViewModel类: 实现HomeViewModel类,需要继承继承自ViewModel ") } } }) } } } Koin 初始化: Koin的初始化分为两步: 定义ViewModel,告诉Kioin从哪里找到ViewModel和Repository并自动生成,这里我选择直接写在BaseApplication中,需要注意的是需要定义在最外层 本项目使用开源组件库:koin、timber、permissionx、BaseRecyclerViewAdapterHelper 视频:Android中高级进阶之MVVM与JetPack
buildSrc/src/main/kotlin/Dependencies.ktobject Versions { const val compose = "1.6.3" const val koin androidx.compose.material3:material3:${Versions.compose}" // DI const val koinCore = "io.insert-koin :koin-core:${Versions.koin}" const val koinAndroid = "io.insert-koin:koin-android:${Versions.koin}
官网:mockk.io KOIN 面向 Kotlin 开发者的轻量依赖注入框架。 [1240] KOIN 提供了轻量的函数式依赖注入 DSL,无需代码生成和反射。 startKoin { androidContext(this@MyApplication) modules(myModule) } } } 官网:https://insert-koin.io
由于 Rudi 最开始是以 Koin 为参考,写的基于函数 API 的依赖注入框架,后来发现 inventory 这个库,就又添加了一套属性宏 API。
因为Helidon SE 缺乏依赖注入的手段,因此为此使用了Koin。 以下代码示例,是包含 main 方法的类。为了实现依赖注入,该类继承自KoinComponent。 首先,Koin 启动,然后初始化所需的依赖并调用startServer()方法—-其中创建了一个WebServer类型的对象,应用程序配置和路由设置传递到该对象; 启动应用程序后在Consul注册: object 和 Helidon SE 一样,Ktor 没有开箱即用的 DI,所以在启动服务器依赖项之前应该使用 Koin 注入: val koinModule = module { single { ApplicationInfoService application-info { name: "ktor-service" framework { name: "Ktor" release-year: 2018 } } 在 Ktor 和 Koin 在 Koin 中,模块类似于 Spring 框架中的应用程序上下文。
因为Helidon SE 缺乏依赖注入的手段,因此为此使用了Koin。 以下代码示例,是包含 main 方法的类。为了实现依赖注入,该类继承自KoinComponent。 首先,Koin 启动,然后初始化所需的依赖并调用startServer()方法—-其中创建了一个WebServer类型的对象,应用程序配置和路由设置传递到该对象; 启动应用程序后在Consul注册: 和 Helidon SE 一样,Ktor 没有开箱即用的 DI,所以在启动服务器依赖项之前应该使用 Koin 注入: val koinModule = module { single { ApplicationInfoService name: "ktor-service" framework { name: "Ktor" release-year: 2018 } } 在 Ktor 和 Koin 在 Koin 中,模块类似于 Spring 框架中的应用程序上下文。
EasyPermission 更多介绍见:EasyPermission[1] ardf更多文章: Android基于DataBinding封装RecyclerView实现快速列表开发 Android基于DataBinding+Koin BaseBindingViewModelActivity、BaseFragment、BaseBindingFragemnt、BaseBindingViewModelFragment 关于其他几个基类的使用见:Android基于DataBinding+Koin
因为Helidon SE 缺乏依赖注入的手段,因此为此使用了Koin。 以下代码示例,是包含 main 方法的类。为了实现依赖注入,该类继承自KoinComponent。 首先,Koin 启动,然后初始化所需的依赖并调用startServer()方法—-其中创建了一个WebServer类型的对象,应用程序配置和路由设置传递到该对象; 启动应用程序后在Consul注册: 和 Helidon SE 一样,Ktor 没有开箱即用的 DI,所以在启动服务器依赖项之前应该使用 Koin 注入: val koinModule = module { single { ApplicationInfoService name: "ktor-service" framework { name: "Ktor" release-year: 2018 } } 在 Ktor 和 Koin 在 Koin 中,模块类似于 Spring 框架中的应用程序上下文。
状态管理与导航状态管理:使用 mutableStateOf 或 ViewModel(通过 koin 或 kodein 注入)。
图像编辑器 Monica Monica 是一款跨平台的桌面图像编辑器,使用 Kotlin Compose Desktop 进行开发基于 mvvm 架构,使用 koin 作为依赖注入的框架。
Koin ? 随着 Kotlin 被越来越多地用于移动和服务端开发,其相关生态系统也在不断发展。Koin 是一个Kotlin框架,用于处理软件开发中的常规问题之一:依赖注入。 尽管有多种 Kotlin 依赖注入框架可供选择,我们的团队更喜欢 Koin 的简单性。Koin 避免使用注解,而是通过构造函数或模仿 Kotlin 的延迟初始化,从而仅在需要时才注入对象。
许多流行的库已经采用了 Kotlin Multiplatform,包括异步事件处理框架 Ktor、类型安全的 SQL API 生成器 SQLDelight、GraphQL 客户端 Apollo 和依赖注入框架 Koin
比如我每次让 AI 写 Android 代码,都要说: • 用 Hilt 做依赖注入,不要用 Koin • 状态管理用 sealed class + StateFlow,不要用 LiveData • Repository references/conventions.md:- 语言:优先 Kotlin - 架构:MVVM + Repository - 异步:suspend + Flow/StateFlow - DI:Hilt(禁止 Koin
于是就有了一些库来实现自动依赖注入,有两个实现思路(koin的实现以后再聊~), 一是运行期反射连接依赖项,编译影响小,但运行慢 二是编译期就连接依赖项,创建辅助类需要额外的io和编译耗时,会拖慢编译速度 //... } 尾声 简单总结下dagger的优缺点~ 优势:无反射、支持增量编译 缺点:构建过程需要而外的io和编译时间、生成类会增大包体积、不够好用、 后续计划:dagger细枝、hilt、koin
与 Dagger 和 koin 中的 named 作用相似。