专栏首页大话swiftkotlin构建MVVM应用之依赖注入--Koin

kotlin构建MVVM应用之依赖注入--Koin

在开发的过程中,依赖注入有什么的好处呢?

  • 增加程序重用
  • 模块功能单一
  • 方便测试
  • 需求变更,减少程序开发
  • 充分的解耦合

Koin是一个Kotin极轻量的依赖注入框架,据官方资料显示,它有一下特点

  • 无代理
  • 无代码生成
  • 无反射。

在app\build.gradle中引入依赖

  1. //koin(依赖注入)
  2. implementation "org.koin:koin-androidx-scope:2.0.1"
  3. implementation "org.koin:koin-androidx-viewmodel:2.0.1"
  4. implementation "org.koin:koin-androidx-ext:2.0.1"

给大家展示一下整体的目录结构

首先,定义我们的model层,定义username和password两个被观察字段

  1. package com.xiangshike.live.model
  2. import androidx.databinding.ObservableField
  3. data class UserModel(
  4. var username: ObservableField<String> = ObservableField(""),
  5. var password: ObservableField<String> = ObservableField("")
  6. ) {
  7. override fun toString(): String {
  8. return "UserModel(username=
  9. }
  10. }

其次、定义我们的repository层返回我们需要的数据,当然了,你也可以通过网络请求获得数据

  1. package com.xiangshike.live.repository
  2. import androidx.databinding.ObservableField
  3. import com.xiangshike.live.model.UserModel
  4. class UserRepository {
  5. fun getUser(): UserModel = UserModel(ObservableField("hanyun"), ObservableField("123456"))
  6. }

再次、在我们viewmodel层把repository和model进行关联

  1. package com.xiangshike.live.viewmodel
  2. import androidx.lifecycle.ViewModel
  3. import com.xiangshike.live.model.UserModel
  4. import com.xiangshike.live.repository.UserRepository
  5. class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
  6. fun getUser(): UserModel = userRepository.getUser()
  7. }

然后、在module中声明注入

  1. package com.xiangshike.live.di
  2. import com.xiangshike.live.repository.UserRepository
  3. import com.xiangshike.live.viewmodel.UserViewModel
  4. import org.koin.androidx.viewmodel.dsl.viewModel
  5. import org.koin.core.module.Module
  6. import org.koin.dsl.module
  7. val viewModelModule = module {
  8. viewModel {
  9. UserViewModel(get())
  10. }
  11. }
  12. val repositoryModule = module {
  13. factory<UserRepository> {
  14. UserRepository()
  15. }
  16. }
  17. val appModule: List<Module> = listOf(repositoryModule, viewModelModule)

再然后、声明引入我们的注入

  1. package com.xiangshike.live.di
  2. import com.xiangshike.live.repository.UserRepository
  3. import com.xiangshike.live.viewmodel.UserViewModel
  4. import org.koin.androidx.viewmodel.dsl.viewModel
  5. import org.koin.core.module.Module
  6. import org.koin.dsl.module
  7. val viewModelModule = module {
  8. viewModel {
  9. UserViewModel(get())
  10. }
  11. }
  12. val repositoryModule = module {
  13. factory<UserRepository> {
  14. UserRepository()
  15. }
  16. }
  17. val appModule: List<Module> = listOf(repositoryModule, viewModelModule)

这句为我们自动注入get()自动获得了UserRepository,然后实例化注入进来

  1. UserViewModel(get())

启用注入

  1. package com.xiangshike.live
  2. import android.app.Application
  3. import android.content.ContextWrapper
  4. import com.xiangshike.live.di.appModule
  5. import org.koin.core.context.startKoin
  6. lateinit var mApplication: Application
  7. class App : Application() {
  8. override fun onCreate() {
  9. super.onCreate()
  10. mApplication = this
  11. startKoin {
  12. modules(appModule)
  13. }
  14. }
  15. }
  16. object Application : ContextWrapper(mApplication)

表示启用注入

  1. startKoin {
  2. modules(appModule)
  3. }

使用

  1. class MainActivity : BaseActivity<ActivityMainBinding>() {
  2. private val mUserModel: UserModel by lazy { UserModel() }
  3. private val mUserViewModel: UserViewModel by viewModel()
  4. override fun getLayoutId(): Int = R.layout.activity_main
  5. override fun initData() {
  6. val user: UserModel = mUserViewModel.getUser()
  7. mUserModel.username = user.username
  8. mUserModel.password = user.password
  9. mDataBind.userModel = mUserModel
  10. }
  11. override fun initView() {
  12. loginBtn.setOnClickListener {
  13. login()
  14. }
  15. }
  16. ...
  17. }

我们通过下面这句,引入了我们UserViewModel

  1. private val mUserViewModel: UserViewModel by viewModel()

最终,我们应用启动的时候,给我们的用户和密码设置了默认值,同时实现了view和model的双向绑定。

链接:https://pan.baidu.com/s/1hUYyP7Uhb96LUV-CqgFp6g

提取码:ipcv

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:寒云

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gin框架之用swagger自动生成API文档

    我们在工作当中经常需要用到接口文档,那么怎么写接口文档呢?又会遇到哪些坑呢?刚开始的时候,我们用word写文档,后来我们用markdown写文档。但是这些方式不...

    大话swift
  • iPadOS上启动黑屏翻车问题分析(一)

    iOS的每次大版本更新都会是iOSer的苦难之旅,这次的iPadOS估计肯定也不例外当然了这次估计是针对iPadOS的苦难而已吧。在iOS13以下的iOS中iP...

    大话swift
  • category在iOS开发中的使用

    上面是后端同学按照照module的方式开发的服务,在整个的项目中请求中前缀相同而每个module都有自己的前缀,结合起来整个请求URL格式就可以拆分为

    大话swift
  • 钱学森:再谈开放的复杂巨系统

    刚才戴汝为同志的报告讲得很好。戴汝为同志多年从事人工智能、知识系统的工作,去年他听说我们在这里讨论开放的复杂巨系统问题,很感兴趣。因此,他是从人工智能、知识系统...

    马上科普尚尚
  • postman的使用技巧

    有段时间调用接口比较频繁。虽然用charles, fiddler都能胜任。但是不想用代理去连手机。而且各个环境来回切换比较麻烦。很早以前用过一段时间po...

    赵云龙龙
  • SpringBoot集成Druid连接池

    https://www.cnblogs.com/noneplus/p/11528129.html

    Noneplus
  • 配置详解 | performance_schema全方位介绍

    在上一篇 《初相识 | performance_schema全方位介绍》 中粗略介绍了如何配置与使用performance_schema,相信大家对perfor...

    沃趣科技
  • 美欲重夺超算霸主:18亿美元投资新E级超算计划2022年完成

    精彩回顾 2018 新智元产业跃迁 AI 技术峰会圆满结束,点击链接回顾大会盛况: 爱奇艺 http://www.iqiyi.com/l_19rr3aqz3z...

    新智元
  • React Native调用原生UI组件

    在React Native 中,其已经将几个常用的原生组件进行了封装,但是并不是所有系统的原始组件都被封装了,因此有时候我们不得不自己动手封装一下,从而能够使用...

    xiangzhihong
  • 小白也能玩转Kubernetes 你与大神只差这几步

    6月30日,腾讯云联合InfoQ举办的云+社区技术沙龙,以Kubernetes 上云一键部署、云上大规模计算平台构建、CIS底层技术实现、Tencent Hub...

    云加社区技术沙龙

扫码关注云+社区

领取腾讯云代金券