Koin是适用于Kotlin的轻量级注入工具,它的特点是:无代理,无代码生成,无反射。

1.在Application中初始化

  1. class MyApp : Application() {
  2. override fun onCreate() {
  3. super.onCreate()
  4. startKoin {
  5. //开始启动koin
  6. androidContext(this@MyApp)//这边传Application对象,这样你注入的类中,需要app对象的时候,可以直接使用
  7. modules(appModule)//这里面传各种被注入的模块对象,支持多模块注入
  8. }
  9. }
  10. val appModule = module {//里面添加各种注入对象
  11. }
  12. }

通过调用startKoin来启动koin,里面填注入对象.

2.普通注入使用方式—Factory注入

Factory注入方式跟普通new一个对象一毛一样.

class Person {
    fun speak() {
        CSKoinLog.I("武汉加油,中国加油")
    }
}

首先我们创建一个Person类,然后在我们的MyApp中的appModule中,将该Person类注入一下

class MyApp : Application() {
      ...
        val appModule = module {//里面添加各种注入对象
        factory {//普通的注入方式
            Person()
        }
    }
}

注入完了之后,就可以在Activity中调用了

class FactoryActivity : AppCompatActivity() {
    //调用方式有大致下面几种,后面会再说到
    val person: Person by inject()//方法一
    val person2 by inject<Person>()//方法二
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_factory)
        val person3 = get<Person>()//方法三
        person.speak()
        person2.speak()
        person3.speak()
        CSKoinLog.I(person.hashCode().toString())
        CSKoinLog.I(person2.hashCode().toString())
        CSKoinLog.I(person3.hashCode().toString())
    }
}

每次新生成一个对象
image.png

3.单例模式—Single用法

Koin支持调用单例的方法,而且调用起来非常简单,也是在MyApp中的appModule中注入,不过这次注入方式为single

class UserData {
    var userName: String? = null
    var age: Int? = null
    fun info() {
        CSKoinLog.I("用户名:" + userName + "////年龄:" + age)
    }
}

我新建了一个UserData类,该类中有几个属性,和一个输出所有属性的方法,在application的appModule中,将该类注入一下.

val appModule = module {//里面添加各种注入对象
        ...
        single {//单例的注入方式
            UserData()
        }
    }

调用

class SingleActivity : AppCompatActivity() {
    val userData: UserData by inject()
    val userData2: UserData by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_single)
        CSKoinLog.I(userData.hashCode().toString())
        CSKoinLog.I(userData2.hashCode().toString())
        userData.userName = "张飞"
        userData.age = 17
        userData2.info()
        userData2.userName = "关羽"
        userData2.age = 18
        userData.info()
    }
}

单利创建的对象是一个
image.png

4.viewModel用法(官方原文,没太看懂)

koin还对MVVM模式中的viewModel封装,调用起来更加方便了,你的viewModel要继承lifecycle的ViewModel,然后可以通过get()方法,调用其他的注入对象(这个后面详细解说)

class MyViewModel:ViewModel() {
    var NumData :Int = 0
    override fun onCleared() {
        super.onCleared()
        CSKoinLog.I("调用了销毁方法")
    }
}

我这边创建了一个MyViewModel类,该类继承lifecycle的ViewModel,在Application中的appModule中,将该类注册下:

val appModule = module {//里面添加各种注入对象
        ...
        viewModel {
            MyViewModel()
        }
    }
class ViewModelActivity : AppCompatActivity() {
    val myViewModel: MyViewModel by viewModel()
    val myViewModel2 by viewModel<MyViewModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_model)
        CSKoinLog.I(myViewModel.hashCode().toString())
        CSKoinLog.I(myViewModel2.hashCode().toString())
        CSKoinLog.I(myViewModel.NumData.toString())
        findViewById<Button>(R.id.btn_change).setOnClickListener {
            myViewModel.NumData = 1
            CSKoinLog.I(myViewModel.NumData.toString())
        }
    }
}

viewmodel是同一个
image.png

https://www.jianshu.com/p/bccb93a78cee?utm_campaign=shakespeare&utm_content=note&utm_medium=seo_notes&utm_source=recommendation