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

Jetpack Composeでの画面遷移

Jetpack Composeでの画面遷移

iwata naoki

June 30, 2022
Tweet

Other Decks in Programming

Transcript

  1. © ZOZO, Inc. https://zozo.jp/
 3 • ファッションEC
 • 1,500以上のショップ、8,400以上のブランドの取り扱い
 •

    常時90万点以上の商品アイテム数と毎日平均2,600点以上の新着 商 品を掲載(2022年3月末時点)
 • ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など

  2. © ZOZO, Inc. 概要
 Jetpack Composeを使用した画面遷移に関して、公式ドキュメントには以下の記述があります。
 そこで今回は、なぜ公式ドキュメントではFragmentの使用をオススメしているのか、
 公式ドキュメントとは逆にComposeからFragmentを利用する形で検証します。
 また、公式ドキュメントに従ってFragmentをComposableのラッパーとした場合、
 どのようにComposeを実装していき移行するかを画面遷移の観点でまとめます。


    
 『ハイブリッド アプリの場合は、フラグメント ベースの Navigation コンポーネントを使用するとともに、ビューベースの画面、 Compose の画面、およびビューと Compose の両方を使用する画面を保持するフラグメントを使用することをおすすめします。ま ず、アプリの各画面フラグメントをコンポーザブルのラッパーにします。次に、それらの画面すべてを一緒に Navigation Compose に 関連付けて、すべてのフラグメントを削除します。』 Android Developers Compose を使用したナビゲーションより引用 https://developer.android.com/jetpack/compose/navigation?hl=ja#interoperability 
 
 
 6
  3. © ZOZO, Inc. 結論
 7 • Jetpack Composeでの画面遷移は公式ドキュメントの記載通りにFragmentでComposeをラップする実装で行うと問 題点が少なく実装が可能です
 •

    既存実装が残る限りJetpack ComposeのNavigationは使うのが難しい
 ◦ Jetpack Composeと既存実装が併存する間、新規画面は移行を考えた実装が必要です

  4. © ZOZO, Inc. Compose (NavGraph) Compose→Fragment→Fragmentとなる遷移
 NavHostFragmentを使用した場合、一見画面遷移できているように見えるが、
 Compose側が戻るボタンの処理をフックしてしまいFragmentB→Aの戻る操作が正しく行えない。
 
 ①Compose→②FragmentA→③FragmentB→戻るボタンとした際に


    期待値は②のFragmentAが表示されることだが、実際には①Composeまで戻ってしまう。
 12 Compose (AndroidView) 親Fragment(NavHostFragment) ②Fragment A findNavController() ③Fragment B ①Compose Composeの遷移 Navigation Componentの遷移 戻る処理 こちらが戻る処理を フックしてしまう
  5. © ZOZO, Inc. Compose→Fragment→Composeとなる遷移
 FragmentからJetpack Composeへ遷移する際にFragment側に改修が必要になる。
 例えばリストがFragment、詳細がComposeで実装されていた場合などで、
 リストから詳細へ遷移する際にクリックイベントをJetpack Comoseへ引き回してくる必要がある。
 →

    Fragment Result APIで取れるが、既存実装を改修するのであればCompose化を考えたほうが良さそう。
 
 13 Compose (NavGraph) Compose (AndroidView) Fragment (リスト画面) Compose (詳細画面) 選択結果 Fragmentでの選択結果をFragment Result APIでComposeに渡す
  6. © ZOZO, Inc. 検討結果
 • Composeで既存実装をラップする実装をするには、既存実装側に手を入れる必要があったり、戻る操作を正しく実現 するのに難がある
 ◦ 公式ドキュメントではFragmentでComposableをラップするのをオススメしていたと思われる
 ◦

    大半の画面をComposeで実装しても、移行するのが辛い既存実装があると完全にComposeのNavigationに移行は できない
 • 併用が必要になるのが間違いないので新規実装時にComposeへ移行することを見据えた実装が必要になる
 
 14
  7. © ZOZO, Inc. 移行を見据えて既存実装とJetpack Composeを併用する
 新しい画面の実装手順
 1. Jetpack ComposeでステートレスなComposableをScreenとして実装する
 2.

    ViewModelを実装する
 3. Screenと、ステートや遷移イベントと紐付けを行うRouteを実装する
 4. Jetpack Compose内での遷移定義するNavigationを実装する
 5. RouteにThemeとNavigationを紐付けるFragmentを実装する
 6. 既存の画面遷移方法で新規Fragmentへ遷移する
 
 
 16 既存NavHostFragment 既存Fragment (手を加えない) 新規Fragment ComposeView (NavHost) Compose Screen A Compose Screen B 新規Fragment Composeの遷移 Navigation Componentの遷移 戻る処理
  8. © ZOZO, Inc. Jetpack ComposeでステートレスなScreenを実装する
 • Screenは引数でステートを受け取り、イベントをコールバック で返す
 • ScreenではViewModelを引数に取らない


    ◦ Previewをしやすくする
 ◦ 不要な再Composeを減らす
 
 17 既存NavHostFragment 既存 Fragment 新規Fragment ComposeView (NavHost) Compose Screen A Compose Screen B 新規 Fragment Tips
 • Screenの単位でTopBarを定義した方がタイトルやメニューを各Screenから TopBarを管理する画面へ状態を伝える必要がなくなるので楽になる

  9. © ZOZO, Inc. Routeの実装
 • Screenとステートや遷移イベントと紐付けを行うRouteを実装
 
 19 既存NavHostFragment 既存

    Fragment 新規Fragment ComposeView (NavHost) Compose Screen A Compose Screen B 新規 Fragment Navigation ComponentではViewModelで遷移時のパラメータ (id) を受け取れなかったので Routeで指定できるようにする ここでScreenにUIの状態を渡す
  10. © ZOZO, Inc. まとめ
 • Jetpack Composeでの画面遷移は公式ドキュメントの記載通りにFragmentでComposeをラップする実装で行うと問 題点が少なく実装が可能です
 • 既存実装が残る限りJetpack

    ComposeのNavigationは使うのが難しい
 ◦ Jetpack Composeと既存実装が併存する間、新規画面は移行を考えた実装が必要です
 
 23