Koin紹介5. Daggerとの違
い
private val mainComponent by inject<MainComponent>()
private val mainComponent: MainComponent by inject()
@Inject lateinit var mainComponent: MainComponent
フィールドでの宣言
・Dagger
・KOIN
OR
6. Daggerとの違
い
private val mainComponent by inject<MainComponent>()
private val mainComponent: MainComponent by inject()
@Inject lateinit var mainComponent: MainComponent
フィールドでの宣言
・Dagger
・KOIN
OR
inline fun <reified T> ComponentCallbacks.inject(
name: String = "",
module: String? = null,
noinline parameters: ParameterDefinition = emptyParameterDefinition()
) = lazy { (StandAloneContext.koinContext as KoinContext).get<T>(name, module, parameters) }
7. KOIN 紹
介• 使い方
// KOIN
ext.koin_version = "1.0.0-beta-3"
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
testImplementation "org.koin:koin-test:$koin_version"
dependenciesへ追加
8. KOIN 紹
介• 使い方
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.matsudamper.smallapp.sample">
<application
android:name=".App"
class App : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(module))
}
}
val module = module {
single { MainComponent() }
single { SingletonComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
9. KOIN 紹
介• 使い方
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.matsudamper.smallapp.sample">
<application
android:name=".App"
class App : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(module))
}
}
val module = module {
single { MainComponent() }
single { SingletonComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
10. KOIN 紹
介• 使い方
val module = module {
factory { MainComponent() }
single { SingletonComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
通常
シングルトン
private val mainComponent by inject<MainComponent>()
11. KOIN 紹
介• 使い方
val module = module {
factory { MainComponent() }
single { SingletonComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
Android
ViewMod
el
12. KOIN 紹
介• 使い方
val module = module {
factory { MainComponent() }
single { SingletonComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
Android
ViewMod
el
val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
val viewModel: MainViewModel by viewModel()
15. KOIN 紹
介• 引数の依存解決
val module = module {
factory { MainComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
class MainViewModel(
val mainComponent: MainComponent, var uri: Uri
) : ViewModel()
②依存関係 解決
①型を見て
16. KOIN 紹
介• 引数の依存解決
val module = module {
factory { MainComponent() }
viewModel { (uri: Uri) -> MainViewModel(get(), uri) }
}
val viewModel: MainViewModel by viewModel { parametersOf(Uri.parse("")) }
17. KOIN 紹
介KOIN対応
• Android App
• Android ViewModel Architecture Components
• Android scoped injection with Lifecycle
• Kotlin application
• Junit
• Spark web application
• Ktor
Editor's Notes LTを始めます。
自己紹介と最近使い始めたKotlinのDIフレームワーク、KOINの紹介をしていきます。 最近は画面オーバーレイ系のアプリを主にやっています。
簡単に画面上にオーバーレイできるフレームワークを作り、それを使ったアプリを作っています。
好きなウェジェットをオーバーレイできるアプリがすごく便利です。先人達が作ったものを有効活用できます。 それではKOINを紹介していきます。
KOINとはKotlinのDIフレームワークです。
Daggerとの違いと使い方を紹介していきます。 Daggerとの違いはアノテーションプロセッシングでのコード生成がありません。
じゃあどうやって注入しているかといいますと。 デリゲーションを使っています。
Injectというアノテーションが無くなり、injectに移譲をしています。
Private、イミュータブルで宣言できます。
移譲先のInjectの中を見ると lazy(レイジー)になっているのは注意です。 使い方です。
dependenciesへ追加します。現在1.0.0 beta3が最新版となっています。 Applicationを継承したクラスを作ってManifestに登録するところはDaggerと同じです。
ApplicationのonCreateでstartKoinとするだけで使えます。 ここでモジュールを指定します。
ここを詳しく見ていきます。 通常はfactory、シングルトンにしたい時はsingleを使います。
これによって依存が解決されます。 更にAndroidアーキテクチャコンポーネンツのViewModelを注入してくれる機能もあります。
引数がありますがこの説明は後回しにします。 ViewModelProvidersを使っていたコードが簡単になりました。 でも、AndroidアーキテクチャコンポーネンツのViewModelってコンストラクタが欲しかったらFactoryが必要だったはず KOINがやってくれます。 Getと書けば引数の型を見て依存を解決してくれますし parametersOfで使う側から引数を指定することもできます。
以上が簡単な使い方でした。 KOINは様々なプラットフォームに対応しています。 Get Startやサンプルが充実しているので始めやすいですので是非利用してみて下さい。 以上でKotlinの紹介をDIフレームワークKOINの紹介を終わります。 KOINは簡潔に書け、シンプルで好きです。
ありがとうございました。