本教程可以让你使用Koin框架写一个可以注入和调用你的ViewModel组件的Android应用
框架引入
首先,将Kotlin的Android依赖在Gradle文件中引入如下:
// Add Jcenter to your repositories if needed
repositories {
jcenter()
}
dependencies {
// Koin for Android - Scope feature
// include koin-android-scope & koin-android
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
}
我们的接口
让我们创建一个HelloRepository
来提供一些数据:
interface HelloRepository {
fun giveHello(): String
}
class HelloRepositoryImpl() : HelloRepository {
override fun giveHello() = "Hello Koin"
}
让我们创建一个ViewModel类来使用这些数据:
class MyViewModel(val repo : HelloRepository) : ViewModel() {
fun sayHello() = "${repo.giveHello()} from $this"
}
实现Koin模块
用module
函数声明模块。让我们定义第一个组件:
val appModule = module {
// single instance of HelloRepository
single<HelloRepository> { HelloRepositoryImpl() }
// MyViewModel ViewModel
viewModel { MyViewModel(get()) }
}
?> 我们用viewModel
关键字在module
中声明MyViewModel
类。Koin将为lifecycle ViewModelFactory提供一个MyViewModel,并将其绑定到当前组件。
启动Koin
有了module以后,就可以用Koin启动它。打开或者创建你的自定义的Application类(别忘了在mainfest.xml文件中声明),调用startKoin()
函数:
class MyApplication : Application(){
override fun onCreate() {
super.onCreate()
// Start Koin
startKoin{
androidLogger()
androidContext(this@MyApplication)
modules(appModule)
}
}
}
依赖注入
MyViewModel
组件会和HelloRepository
实例一起创建。要在Activity里面获取,需要使用代理注入器by inject()
在Activity里注入:
class MyViewModelActivity : AppCompatActivity() {
// Lazy Inject ViewModel
val myViewModel: MyViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_simple)
//...
}
}
提示
by viewModel()
:这个函数可以让我们从Koin里获得ViewModel实例。
getViewModel()
:这个函数是不通过懒加载的方式,直接获得实例。