Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apollo on Android 悪戦苦闘話

geckour
August 28, 2020

Apollo on Android 悪戦苦闘話

Presented on GraphQL Tokyo Meetup #10 LT

geckour

August 28, 2020
Tweet

More Decks by geckour

Other Decks in Technology

Transcript

  1. About me • お名前: @geckour (a.k.a. ISHIDA Tomohiro) • 所属:

    Quipper Ltd. • お役目: Android app developer (Kotlin すき) • 趣味: 植物を育てたり枯らしたりすること
  2. Apollo Android • Android のための Apollo による GraphQL クライアント実装 •

    Kotlin の対応も進んでいっている • (どうやら Apollo iOS をマスタとして後手で開発されているらしい)
  3. Apollo Android の Kotlin 対応 • Data classes ◦ Apollo

    Android は GraphQL の schema/query 定義から Android app で利用でき るデータオブジェクトを生成してくれる ◦ Kotlin 対応をオンにすると data class を生成させることができる
  4. Apollo Android の Kotlin 対応 • Data classes ◦ 生成されたクラスは階層構造を保持していない

    ▪ 名前空間が1つしかないので同じ型を複数箇所で使っている場合に衝突する ▪ 衝突したときには型の名前の末尾にナンバリングがつく • ex) User1, User2
  5. Apollo Android の Kotlin 対応 • Data classes ◦ 生成されたクラスは階層構造を保持していない

    ▪ ドメインモデルを作る等、型の変換をする場合に大変
  6. Apollo Android の Kotlin 対応 • Data classes ◦ 生成されたクラスは階層構造を保持していない

    ▪ ドメインモデルを作ることを諦める ▪ Colocating/fragment を導入するとドメインモデルを使わなくても結構いい感 じにできることがわかった
  7. Apollo Android の Kotlin 対応 • Interface ◦ Kotlin における

    interface 的なやつ ▪ Java から存在する interface ▪ Kotlin から存在する Sealed classes
  8. Apollo Android の Kotlin 対応 • Interface ◦ Kotlin における

    interface 的なやつ ▪ Java から存在する interface ▪ Kotlin から存在する Sealed classes
  9. sealed class Animal( val id: String, val height: Int, val

    weight: Int, val age: Int ) { class Human( id: String, height: Int, weight: Int, age: Int, val languages: List<String>, val hobbies: List<String> ) : Animal(id, height, weight, age) class Cat( id: String, height: Int, weight: Int, age: Int, val isPet: Boolean ) : Animal(id, height, weight, age) }
  10. Apollo Android の Kotlin 対応 • Interface ◦ Kotlin における

    interface 的なやつ ▪ Java から存在する interface ▪ Kotlin から存在する Sealed classes ▪ Apollo は現時点でどちらにも対応していない
  11. Apollo Android の Kotlin 対応 • Interface ◦ Kotlin における

    interface 的なやつ ▪ Java から存在する interface ▪ Kotlin から存在する Sealed classes ▪ Apollo は現時点でどちらにも対応していない ▪ Apollo では nullable なフィールドを type の数だけ生やすことで対応
  12. Apollo Android の Kotlin 対応 query Animals { animals {

    id height weight age ... on Human { name languages hobbies } ... on Cat { isPet } } } data class Animal( val id: String, val height: Int, val weight: Int, val age: Int, val asHuman: AsHuman?, val asCat: AsCat? ) data class AsHuman( val name: String, val languages: List<String>, val hobbies: List<String> ) data class AsCat( val isPet: Boolean ) →