相关库
// Koin for Kotlin
implementation 'org.koin:koin-core:2.2.2'
implementation 'org.koin:koin-core-ext:2.2.2'
// Koin for AndroidX
implementation "org.koin:koin-androidx-scope:2.2.2"
implementation "org.koin:koin-androidx-viewmodel:2.2.2"
implementation "org.koin:koin-androidx-fragment:2.2.2"
implementation "org.koin:koin-androidx-ext:2.2.2"
Koin是什么?为什么要用Koin?
Koin 是一个注入框架无需反射/代理 即可方便使用对象去调用某个类对象从而使用类对象里边的方法。
我也不懂,这里只是教大家怎么是实践使用Koin,只因项目上使用到了不得已而为之
Koin 来源于一位开源作者
Inside Koin 3.2 - Optimizing your Modules with Includes
其木的是为了在Kotlin中方便快捷进行注入,在这之前有另一个开源注解Degger2这里就不做描述了,有需要的自行百度
使用方法分几步:
首先1.你要注入的对象是什么,也就是你将要使用的类
这里以
LoginPresenter 为例
class LoginPresenter(val login: LoginModel) {
fun login():Boolen{
return login.do()
}
}
2.LoginPresenter 所需要的参数类 LoginModel
interface LoginModel{
fun do(): Boolean
}
class LoginModelImpl : LoginModel{
override fun do(): Boolean {
// to do login ... 这里省略了一些去登陆的逻辑
return true
}
}
3.新建一个类 AppMoudle 将需要注入的类 使用Koin的model进行注册
package com.nova.di
import com.nova.koin.HelloRepository
import com.nova.koin.HelloRepositoryImpl
import com.nova.koin.MySimplePresenter
import org.koin.dsl.module
/**
* @author Created by Li
* 2022/7/14
*/
val appModule = module {
// single 表示单例
single<LoginModel> { LoginModelImpl() }
// factory 表示工厂 get() 表示自动带入上边注册的参数
factory { LoginPresenter(get()) }
}
4.在Application处开始注入对象
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
// Level.NONE
androidLogger()
androidContext(this@MyApplication)
modules(appModule)
}
}
}
5.在调用的页面获取注入的对象LoginPresenter
class KoinActivity : AppCompatActivity() {
private val TAG = "KoinActivity"
val loginPresenter: LoginPresenter by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_loin)
if (loginPresenter!= null)
LogUtil.d(TAG, "${loginPresenter.login()}")
}
}
这样子完成后运行其实是会报错的,这里有一个坑开始注入的时候使用
androidLogger() 会报错
java.lang.NoSuchMethodError: No virtual method elapsedNow()D in class Lkotlin/time/TimeMark; or its super classes (declaration of 'kotlin.time.TimeMark' appears in /data/app/~~ArLPm6ZwWHpL7fiTI_vDjQ==/com.nova.fraworkproject-QE0TR4fU0SiejzRkgwjc2w==/base.apk)
应该使用如下的设置 *********
androidLogger( Level.NONE)
class MyApplication : Application() {
private var mActivitRouter: ActivitRouter? = null
override fun onCreate() {
super.onCreate()
startKoin {
// Level.NONE
androidLogger( Level.NONE)
androidContext(this@MyApplication)
modules(appModule)
}
}
}
至于怎么使用就到这里了,如果有帮助到你麻烦点赞加关注,day day up.