https://start.insert-koin.io/#/getting-started/koin-for-android

开始

Koin in 5 minutes (5分钟快速入手Koin)

Getting Started (开始)

在Android中开始

在任何一个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应用程序声明。

使用Android Context

在你的定义中,你能通过 androidContext()androidApplication() 函数注入 ContextApplication

1
2
3
module {
single { MyAndroidComponent(androidContext()) }
}

Android组件作为Koin组件

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 接口对其进行标记。

Extended Scope API

for Android (koin-android-scope or koin-androidx-scope projects)

Scope API更接近Android平台。ActivityFragment 都具有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()

Android ViewModel

(koin-android-viewmodel or koin-androidx-viewmodel projects)

Koin也带来了一些特殊的特性来管理ViewModel:

  • viewModel 特殊的DSL关键来来声明一个ViewModel
  • by 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()
}
}