Kotlinのコルーチンについて知りたくって、下記のGoogleが提供しているCodeLabというサイトで勉強しておりますが、
https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#6
ここにある、
viewModelScope
というのを使いたくってですね、まずはアプリのbuild.gradleでこうしました。
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.1.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0'
implementation "android.arch.lifecycle:extensions:1.1.1"
ViewModel内で下記のように書きます
class TaskViewModel(private val repository: TaskRepository):ViewModel() {
//中略
//コルーチンのテスト
fun addTask(context: Context) {
viewModelScope.launch {
//中略
}
}
}
上記のviewModelScopeで
unresolved reference viewModelScope
ってなっちゃいます。
あれーと思い、サンプルを見て、import部分に手動で下記をコピペ。
import androidx.lifecycle.viewModelScope
すると、下記のエラーメッセージに変わりました。
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public val ViewModel.viewModelScope: CoroutineScope defined in androidx.lifecycle
「ははぁ。レシーバータイプが悪いのか??」
と思ってしばらく調べても、悪いところがどこかわかりませんでした。
「詰んだか…」
としょんぼりしておりました。viewModelScope自体、おニューな機能なんですよ。下記のGoogleのブログでアルファ版が紹介されているのが2019年4月なので。
Android で簡単コルーチン: viewModelScope
ちな、これを書いている2020年1月9日時点では、もう AndroidX Lifecycle v2.1.0 としてリリースされています。
build.gradleに
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0"
とやっている部分です。
が、ふと思い当たって自分のソースコードとサンプルをよく見比べてみると
自ソースコードのimport部分
import android.arch.lifecycle.ViewModel
サンプルのimport部分
import androidx.lifecycle.ViewModel
アッ…。
import androidx.lifecycle.ViewModel
上記に変更したらちゃんと読み込めました~(>_<)涙。
これねー。Androidあるあるですけどねー。
importから間違っていると、なかなかわからないんですよ。
ViewModelのソースコード書いた時は、ViewModelScope使う予定はなかったので、普通にAlt+Enterで
import android.arch.lifecycle.ViewModel
されちゃうんですよね。
しかし、後でViewModelScope使うためには、ViewModelは
androidx.lifecycle.ViewModel
を使わないといけなかったんですが、 ViewModel はもう読み込めているのでわからなかったんですね。
ところで、この話は続きがあります。続きはこちら。
まだまだ続くんじゃよ。