kako.dev

開発、自作アプリのこと

ViewModelのDIから始めるKoin入門

公式の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内で使う変数のviewModelvalで宣言できるのも好きなポイントです。 なるべくvarは使いたくないんですよね。。

MainApplicationを作成する

Koinを機能させるためにアプリ内で使うApplicationクラスを作ります。 modules 関数に上記で作った viewModelModule を引数に渡します。

class MainApplication : Application() {
    override fun onCreate(){
        super.onCreate()

        startKoin {
            androidContext(this@MainApplication)
            modules(viewModelModule)
        }
    }
}

AndroidManifestを編集する

MainApplication をアプリ内で使うために AndroidManifestapplicationタグに指定します。

<application
        ...
        android:name=".MainApplication">
        <activity ...
            ....

DI完了

これでMainViewModelをMainActivityにDIできました。

ソースコードの全体像はこちらにおいてあります。参考にしてください。

github.com

以上です。