https://start.insert-koin.io/#/getting-started/koin-for-android
开始
Koin in 5 minutes (5分钟快速入手Koin)
Getting Started (开始)
在任何一个Android类中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
// use AndroidLogger as Koin Logger - default Level.INFO
// 使用AndroidLogger代替KoinLogger - 默认Lovel.INFO
androidLogger()
// use the Android context given there 在这使用给定的AndroidContext
androidContext(this@MainApplication)
// load properties from assets/koin.properties file
// 从assets/koin.properties文件中加载属性
androidFileProperties()
// module list 模块列表
modules(offlineWeatherApp)
}
}
}
|
如果你不能注入Android上下文或者application,请确保使用 androidContext()
函数在你的Koin应用程序声明。
在你的定义中,你能通过 androidContext()
和 androidApplication()
函数注入 Context
和 Application
:
1
2
3
| module {
single { MyAndroidComponent(androidContext()) }
}
|
Koin对 Activity
, Fragment
& Service
进行了扩展,以将其视为现成的KoinComponents:
1
2
3
4
5
6
7
8
9
10
11
12
| class MyActivity : AppCompatActivity(){
// Inject MyPresenter
val presenter : MyPresenter by inject()
override fun onCreate() {
super.onCreate()
// or directly retrieve instance
val presenter : MyPresenter = get()
}
}
|
这些类能被使用:
get()
or by inject()
instance retrieving 检索实例getKoin()
to access th current Koin
instance 访问当前 Koin
实例
如果您需要注入来自另一个类的依赖项,并且无法在模块中声明它,则仍然可以使用 KoinComponent
接口对其进行标记。
for Android (koin-android-scope or koin-androidx-scope projects)
Scope API更接近Android平台。Activity
和 Fragment
都具有Scope API的扩展:currentScope
获取当前关联的Koin scopr。 此scope已创建并绑定到组件的生命周期。
你能直接使用关联的Koin scope来检索组件:
1
2
3
4
5
6
7
8
9
10
11
| class DetailActivity : AppCompatActivity(), DetailContract.View {
// inject from current activity scope instance
override val presenter: DetailContract.Presenter by currentScope.inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
}
}
|
很容易来声明你的Android组件scope:
1
2
3
4
5
6
| module {
// declare a scope for DetailActivity
scope(named<DetailActivity>)> {
scoped<DetailContract.Presenter> { DetailPresenter(get(), get()) }
}
}
|
任何Activity和Fragment都能直接使用scopeAPI: createScope()
, getScope()
and deleteScope()
。
(koin-android-viewmodel or koin-androidx-viewmodel projects)
Koin也带来了一些特殊的特性来管理ViewModel:
viewModel
特殊的DSL关键来来声明一个ViewModelby viewModel()
& getViewModel()
注入ViewModel实例(from Activity
& Fragment
)by sharedViewModel()
& getSharedViewModel()
从宿主Activity中复用ViewModel实例(来自Fragment)
让我们在模块中声明一个ViewModel:
1
2
3
4
5
6
7
8
9
| val myModule : Module = module {
// ViewModel instance of MyViewModel
// get() will resolve Repository instance
viewModel { MyViewModel(get()) }
// Single instance of Repository
single<Repository> { MyRepository() }
}
|
在一个Activity中注入它:
1
2
3
4
5
6
7
8
9
10
11
12
| class MyActivity : AppCompatActivity(){
// Lazy inject MyViewModel
val model : MyViewModel by viewModel()
override fun onCreate() {
super.onCreate()
// or also direct retrieve instance
val model : MyViewModel = getViewModel()
}
}
|