公式のInsertKoinを見れば分かる人はそちらを参照していただくのが一番良いと思うので、この記事は「DIをしたい」「Koin使ってみたいけどどうしたら分からん」という人向けに書いてみます。
個人的にViewModelの依存性解決するのがわかりやすいのではないかなと思いこのタイトルおよび内容にしています。
まずはKoin(DI)無しでViewModelを生成してみる
MainActivityでMainViewModelを生成するとしたらこうなります。
class MainActivity : AppCompatActivity() { private lateinit var viewmodel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewmodel = ViewModelProviders.of(this).get(MainViewModel::class.java) } }
今度はKoinを使ってViewModelを生成してみる
何はともあれKoinをインストールしましょう。
Koinをインストール
build.gradleにjcenterがあるか確認します。なければ追加してください。
repositories { jcenter() }
Koinの依存関係を記述します。
dependencies { ... // koin def koin_version = '2.0.1' implementation "org.koin:koin-core:$koin_version" implementation "org.koin:koin-androidx-viewmodel:$koin_version" }
MainViewModelを作成する
MainActivityに注入するMainViewModelを作成します。 今回はクラスがあればいいだけなので中身は空っぽにします。
class MainViewModel : ViewModel()
あとは必要に応じて中にLivaDataなりリポジトリなり書いていただければ。 今回は説明を割愛しますが、リポジトリもKoinでDIできます。
moduleを作成する
module
関数を使って宣言していきます。
val viewModelModule = module {
viewModel { MainViewModel() }
}
MainActivityにMainViewModelをDI!
by viewModel()
を呼び出すだけでDIしてくれます。
class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModel() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
個人的にこのMainActivity内で使う変数のviewModel
をval
で宣言できるのも好きなポイントです。
なるべくvar
は使いたくないんですよね。。
MainApplicationを作成する
Koinを機能させるためにアプリ内で使うApplicationクラスを作ります。
modules
関数に上記で作った viewModelModule
を引数に渡します。
class MainApplication : Application() { override fun onCreate(){ super.onCreate() startKoin { androidContext(this@MainApplication) modules(viewModelModule) } } }
AndroidManifestを編集する
MainApplication
をアプリ内で使うために AndroidManifest
のapplication
タグに指定します。
<application ... android:name=".MainApplication"> <activity ... ....
DI完了
これでMainViewModelをMainActivityにDIできました。
ソースコードの全体像はこちらにおいてあります。参考にしてください。
以上です。