当前位置: 首页 > 工具软件 > Koin > 使用案例 >

Koin简单使用

锺威
2023-12-01

相关库

    // 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.

 类似资料: