Android コルーチンを便利に利用するためのviewModelScopeが読み込めない

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 はもう読み込めているのでわからなかったんですね。

ところで、この話は続きがあります。続きはこちら。

まだまだ続くんじゃよ。

2020年もよろしくお願いいたします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です