AACのViewModelをKoinでInjectする

Kotlinを利用したプロジェクトで利用できるDIライブラリであるKoin(https://github.com/InsertKoinIO/koin) ですが、Android開発用の拡張ライブラリであるkoin-androidを使ってAndroid Architecture ComponentsのViewModelを生成する方法についてまとめます。

基本的には下記のサイトに記載されている内容です。 https://beta.insert-koin.io/docs/1.0/quick-references/koin-android/#android-architecture-viewmodel

Koinの基本的な使い方については上記githubのREADME等をご参照ください。

Koinを用いない場合のViewModelの生成

Koinを用いない場合のAndroid Architecture ComponentsのViewModelクラスの生成方法は次のようにViewModelProvidersを使用します。

public class MyActivity extends AppCompatActivity {
    public fun onCreate(savedInstanceState: Bundle) {
        val model = ViewModelProviders.of(this).get(MyViewModel::class.java);
    }
}

参考:https://developer.android.com/topic/libraries/architecture/viewmodel

Koinを用いる場合のViewModelの生成

Koinを用いる場合は以下のようにby viewModel()によりインスタンス生成を行います。 通常のクラスの場合はby inject()としますが、ViewModelの場合はby viewModel()を指定してください。

class LoginActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

また、プロパティなどにインジェクションしない場合はgetViewModel()関数を使用することも可能です。

override fun onCreate() {
    super.onCreate()

    val model : MyViewModel = getViewModel()
}

ViewModelの為のモジュール定義

この場合のViewModel生成の為のモジュール定義は通常の場合のsinglefactoryではなく次のようにviewModelを指定します。

val viewModelModule = module {
    viewModel<MyViewModel>()
    viewModel { ParameterNeedViewModel(get()) } // パラメータが必要な場合
}