在开发的过程中,依赖注入有什么的好处呢?
- 增加程序重用
- 模块功能单一
- 方便测试
- 需求变更,减少程序开发
- 充分的解耦合
Koin是一个Kotin极轻量的依赖注入框架,据官方资料显示,它有一下特点
- 无代理
- 无代码生成
- 无反射。
在appbuild.gradle中引入依赖
代码语言:javascript复制-
//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:2.0.1"
给大家展示一下整体的目录结构

首先,定义我们的model层,定义username和password两个被观察字段
代码语言:javascript复制package com.xiangshike.live.modelimport androidx.databinding.ObservableFielddata classUserModel(-
var username:ObservableField<String>=ObservableField(""), -
var password:ObservableField<String>=ObservableField("") ){-
override fun toString():String{ - return "UserModel(username=
-
} }
其次、定义我们的repository层返回我们需要的数据,当然了,你也可以通过网络请求获得数据
代码语言:javascript复制package com.xiangshike.live.repositoryimport androidx.databinding.ObservableFieldimport com.xiangshike.live.model.UserModelclassUserRepository{fun getUser():UserModel=UserModel(ObservableField("hanyun"),ObservableField("123456"))}
再次、在我们viewmodel层把repository和model进行关联
代码语言:javascript复制package com.xiangshike.live.viewmodelimport androidx.lifecycle.ViewModelimport com.xiangshike.live.model.UserModelimport com.xiangshike.live.repository.UserRepositoryclassUserViewModel(private val userRepository:UserRepository):ViewModel(){fun getUser():UserModel= userRepository.getUser()}
然后、在module中声明注入
代码语言:javascript复制package com.xiangshike.live.diimport com.xiangshike.live.repository.UserRepositoryimport com.xiangshike.live.viewmodel.UserViewModelimport org.koin.androidx.viewmodel.dsl.viewModelimport org.koin.core.module.Moduleimport org.koin.dsl.moduleval viewModelModule =module{viewModel {-
UserViewModel(get()) -
} }val repositoryModule =module{factory<UserRepository>{-
UserRepository() -
} }val appModule:List<Module>= listOf(repositoryModule, viewModelModule)
再然后、声明引入我们的注入
代码语言:javascript复制package com.xiangshike.live.diimport com.xiangshike.live.repository.UserRepositoryimport com.xiangshike.live.viewmodel.UserViewModelimport org.koin.androidx.viewmodel.dsl.viewModelimport org.koin.core.module.Moduleimport org.koin.dsl.moduleval viewModelModule =module{viewModel {-
UserViewModel(get()) -
} }val repositoryModule =module{factory<UserRepository>{-
UserRepository() -
} }val appModule:List<Module>= listOf(repositoryModule, viewModelModule)
这句为我们自动注入get()自动获得了UserRepository,然后实例化注入进来
代码语言:javascript复制-
UserViewModel(get())
启用注入
代码语言:javascript复制package com.xiangshike.liveimport android.app.Applicationimport android.content.ContextWrapperimport com.xiangshike.live.di.appModuleimport org.koin.core.context.startKoinlateinit var mApplication:ApplicationclassApp:Application(){-
override fun onCreate(){ -
super.onCreate() mApplication =thisstartKoin {modules(appModule)-
} -
} }objectApplication:ContextWrapper(mApplication)
表示启用注入
代码语言:javascript复制startKoin {modules(appModule)-
}
使用
代码语言:javascript复制classMainActivity:BaseActivity<ActivityMainBinding>(){-
private val mUserModel:UserModelby lazy {UserModel()} -
private val mUserViewModel:UserViewModelby viewModel() -
override fun getLayoutId():Int= R.layout.activity_main -
override fun initData(){ val user:UserModel= mUserViewModel.getUser()mUserModel.username = user.usernamemUserModel.password = user.passwordmDataBind.userModel = mUserModel-
} -
override fun initView(){ loginBtn.setOnClickListener {login()-
} -
} ...}
我们通过下面这句,引入了我们UserViewModel
代码语言:javascript复制-
private val mUserViewModel:UserViewModelby viewModel()
最终,我们应用启动的时候,给我们的用户和密码设置了默认值,同时实现了view和model的双向绑定。
链接:https://pan.baidu.com/s/1hUYyP7Uhb96LUV-CqgFp6g
提取码:ipcv


