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

クックパッドマートの JetpackCompose 事情 & Preview を使い倒したい話

クックパッドマートの JetpackCompose 事情 & Preview を使い倒したい話

Avatar for Yuto Koguchi

Yuto Koguchi

October 28, 2022

Other Decks in Programming

Transcript

  1. Yuto Koguchi - 小口 雄斗 - Twitter: @10llip0p - 2020年新卒入社(3年目)

    - Androidエンジニア - 買物プロダクト開発部 - クックパッドマートアプリ開発 - 趣味 - 車、GeoGuessr
  2. JetpackCompose の魅力 - 宣言的で直感的に UI を構築できる - コード量を削減できる - Preview

    が充実している✨🚀 - クックパッドマートアプリの一番の導入モチベ - 元々 Groupie で UI を構築していたがプレビューが弱点だった - Live Preview がサポートされたのでますます魅力
  3. Activity / Fragment Composable ViewModel DataSource Groupie (RecyclerView) Groupie Item

    UiState API LiveData / StateFlow datasouce app ui ①アクション has ⑤状態を通知 ④データを整形・状態を更新 ⑥表示を更新 ③データ取得 ②レスポンス Preview 活用のためのアーキテクチャ構成 UI Event Interface implement ComposeView (state holder Layer) ⑥composition 画面表示に関するリソース を集約したモジュール。 Preview build のスコープを 小さくする役割 実際は更に ui:feature:<画 面> module に細分 依存関係・データフローを片 方向に整備
  4. ⑤状態を更新 Activity / Fragment ViewModel DataSource Groupie (RecyclerView) Groupie Item

    API LiveData datasouce app ①アクション ⑥状態を通知 ⑦表示を更新 ④データ整形・ viewの更新をcall ②レスポンス 余談:旧アーキテクチャ構成 Presenter ③データ取得 Contract Presenter Interface View Interface Data Models (Entity) has implement
  5. Jetpack Compose 実装についての決め事 - 画面構成の分割単位・呼称・命名方針を統一 - Screen - 画面全体 -

    単一の UiState に基づいて描画 - Section - 画面一行のまとまり - 過去実装での GroupieItem の構成単位に相当 - Component - Sectionを構成するパーツ - 各要素の UI Event は Interface に定義してActivity/Fragment に実装 - composition 時に引数に渡す - 基本的に Screen の実装時に Preview を用意する
  6. - 共通 Scaffold composable を用意 - ローディング・エラー表示のボイラープ レートコードを共通化 - PaddingValues

    対応漏れ対策 - 基底 UiState interface を用意 - ローディング・エラーの状態管理のコー ドベースを統一 ➔ 画面実装時は表示コンテンツの考慮だ けで良くなった その他工夫:共通ページレイアウト
  7. その他工夫:共通ページレイアウト ローディング エラー - 共通 Scaffold composable を用意 - ローディング・エラー表示のボイラープ

    レートコードを共通化 - PaddingValues 対応漏れ対策 - 基底 UiState interface を用意 - ローディング・エラーの状態管理のコー ドベースを統一 ➔ 画面実装時は表示コンテンツの考慮だ けで良くなった
  8. - [方針] 既存アーキテクチャと共存させながら段階的に移行する - GroupieItem の UI 実装を個別に Jetpack Compose

    実装に切り出す - GroupieItem には ComposeView だけを置いて Jetpack Compose の 実行環境として使用する Activity / Fragment Groupie (RecyclerView) Item Compose Activity / Fragment Groupie (RecyclerView) Groupie → Jetpack Compose の移行戦略 bind setContent bind Compose Item Item Item Item Item Item Item Item Item Compose Compose Compose Compose Compose Compose UI UI GroupieItem ComposeView 詳細はブログへ
  9. - [方針] 既存アーキテクチャと共存させながら段階的に移行する - 描画パフォーマンスの問題 - AndroidView in Jetpack Compose

    構成のコンポーネントを大量に 描画した際に OOM が発生 - UX の問題 - AndroidView in Jetpack Compose のコンポーネントでスクロール中 のフォーカスが AndroidView に奪われる(スクロールが引っかかる) - RecyclerView で再描画する際に高さが保持されずに表示位置がずれる 挙動 Groupie → Jetpack Compose の移行戦略 失敗
  10. - Groupie (RecyclerView)実装でも Column, Row のように書きたい - ①汎用 GroupieItem(ViewBindingItem) を実装

    - 実装時は ViewBinding の処理だけに集中できるようになった Groupie を Jetpack Compose に近づける 利用例
  11. - 【結果】Groupie, GroupieItem を Jetpack Compose に近い書き味で実装可能になった Groupie を Jetpack

    Compose に近づける Groupie 実装 JetpackCompose(AndroidViewBinding)実装 この中が Column/Row の ように書ける
  12. まとめ - 単方向の依存関係・データフローな構成で Jetpack Compose の Preview を効率良く実行するアーキテクチャを 整備している -

    Jetpack Compose 実装時の決め事や共通コンポーネント を整備して実装時の判断コストやミス、レビューコストを削減 している - Groupie と Jetpack Compose を併用しやすくする仕組みを 構築している
  13. 今後の展望(妄想) - Preview するテストデータを自動生成したい - 複数の表示パターンを手書きで定義するのが大変 - 案 - API

    レスポンスの Mock(う〜ん... 🤔) - Preview Parameter (結局手書き... 🤔) - API 実装のテストデータを流用(完全に妄想)
  14. 今後の展望(妄想) - PR description に Preview のスクショを自動で貼りたい - 先行事例: Add

    automatic preview screenshot testing with Paparazzi and Showkase https://github.com/android/nowinandroid/pull/101 - やりたいことに対して大げさかも... 🤔