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

Apollo on Android 悪戦苦闘話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for geckour geckour
August 28, 2020

Apollo on Android 悪戦苦闘話

Presented on GraphQL Tokyo Meetup #10 LT

Avatar for geckour

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 ) →