タイトルも本文も何言ってるか分からないかもしれないけれどちょっと感動したので。
課題
ViewModel内の関数で、コルーチン内部でラムダを実行させたい。 このラムダは内部でRetrofitによるsuspend関数のAPI呼び出しを行うためsuspend関数の実行が必要である。どうすればよいか。
対応
ラムダをsuspend関数化したパラメータとして受け取るようにする。
// 共通のレスポンスを返すAPIを扱う関数 fun doQuery(text:String, query: suspend (id:Int) -> Response) { viewModelScope.launch { // 共通の前処理 // APIを実行 val response = query(id) // 以下、responseを使った共通処理 } }
呼び出し側(1)
doQuery("ほげ") { id -> repository.getHogeItems(id) }
呼び出し側(2)
doQuery("ふが") { id -> repository.getFugaItems(id) }
query: suspend (id:Int) -> Response)
がポイント。 ラムダ定義のとこに suspend
つけてあげるとそれがsuspend関数になる。
いや〜、Kotlin便利だわ。