Skip to main content

DIフレームワークKoinをAndroidで使ってみた


Dagger2でDIしたことはあるけど
最近Koinが人気と聞き試しにやってみた


・ドキュメント
もうこのまんまやってみた
https://start.insert-koin.io/#/quickstart/android

 

・gradle

1
ext.koin_version= "2.2.1"

android用のパッケージも入れないと動かないので注意

1
2
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-android-scope:$koin_version"

 

・Kotlin
Module.kt
トップレベルに定義しちゃったけど、これどうすりゃいいんかね

1
2
3
4
5
6
7
val appModule = module {
    // single instance of HelloRepository
    single<HelloRepository> { HelloRepositoryImpl() }
 
    // Simple Presenter Factory
    factory { MySimplePresenter(get()) }
}

MyApplication.kt

1
2
3
4
5
6
7
8
9
10
11
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
 
        startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}

HelloRepository.kt

1
2
3
interface HelloRepository {
    fun giveHello(): String
}

HelloRepositoryImpl.kt

1
2
3
class HelloRepositoryImpl : HelloRepository {
    override fun giveHello() = "Hello Koin"
}

MySimplePresenter.kt

1
2
3
class MySimplePresenter(private val repo: HelloRepository) {
    fun sayHello() = "${repo.giveHello()} from $this"
}

MainActivity.kt

1
2
3
4
5
6
7
8
9
10
class MainActivity : AppCompatActivity() {
    private val firstPresenter: MySimplePresenter by inject()
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        Log.e("masterka", firstPresenter.sayHello())
    }
}

 

これでKoinでinjectできましたとさ
privateの修飾子でもいけるんだね

関連記事:

Pocket