環境 | バージョン |
---|---|
Koin | 1.0.2 |
Android アプリ開発で Dynamic Feature Module 等であとから機能を追加したりする場合に、あとから Koin のモジュールを読み込みたいことがあります。また、Activity や Fragment のインスタンス単位でスコープを切りたい場合にも動的にモジュールを追加したいかもしれません。
そんなときは loadKoinModules
を使ってモジュールを動的に読み込むことができます。
これと scope をうまく組み合わせると Activity や Fragment のインスタント単位でのインジェクションができます。
MyActivity.kt
class MyActivity : AppCompatActivity() {
private val myViewModel: MyViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val scope = hashCode().toString()
loadKoinModules(module {
scope(scope) { MyDispatcher() }
scope(scope) { MyActionCreator() }
viewModel { MyViewModel() }
})
bindScope(getOrCreateScope(scope))
}
}
テストを考えるならメソッドに切り出してしまうなどすれば良さそうです。
AbstractActivity.kt
abstract AbstractActivity : AppCompatActivity() {
abstract fun getModule(scope: String): Module
}
MyActivity.kt
class MyActivity : AbstractActivity() {
private val myViewModel: MyViewModel by viewModel()
override fun getModule(scope: String) = module {
scope(scope) { MyDispatcher() }
scope(scope) { MyActionCreator() }
viewModel { MyViewModel() }
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val scope = hashCode().toString()
loadKoinModules(getModule(scope))
bindScope(getOrCreateScope(scope))
}
}