Koin是适用于Kotlin的轻量级注入工具,它的特点是:无代理,无代码生成,无反射。
1.在Application中初始化
class MyApp : Application() {override fun onCreate() {super.onCreate()startKoin {//开始启动koinandroidContext(this@MyApp)//这边传Application对象,这样你注入的类中,需要app对象的时候,可以直接使用modules(appModule)//这里面传各种被注入的模块对象,支持多模块注入}}val appModule = module {//里面添加各种注入对象}}
通过调用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())
}
}
每次新生成一个对象
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()
}
}
单利创建的对象是一个
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是同一个
