Closed20

Compose で画面間を移動する

どっことどっこと

カタカナで ルート だと route なのか root なのかわからないけど、読んでいくと route なのかなと思える。
で、そのルートは文字列管理なので、列挙子で管理するとイイヨという話なのかな。

どっことどっこと
import androidx.navigation.compose.composable

が明示してあるわ...

どっことどっこと
注: composable() 関数は NavGraphBuilder の拡張関数です。

と言われても、だから何?という...

どっことどっこと

お、 NavHostimport が間違えてるぽいぞ。

import androidx.navigation.compose.NavHost

でimportを書き換えたら composable が参照できるようになった

どっことどっこと

AndroidStudioが悪いのか、コード補完が全然動いてない...
StartOrderScreen が表示されないな

どっことどっこと

StartOrderScreen が表示されないな

import の件でinvalidate してたから、キャッシュがクリアされてたからかな。
ビルドしなおしたら直った。

どっことどっこと

受け取り日画面はフレーバー画面に似ています。唯一の違いは、SelectOptionScreen コンポーザブルに渡されるデータです。

うんうん。

composable() 関数を再度呼び出し、route パラメータに CupcakeScreen.Pickup.name を渡します。

うんうん。

後置ラムダで、 SelectOptionScreen コンポーザブルを呼び出し、前と同じように subtotaluiState.price を渡します。

うん!?!?!?!?受取日ならdateじゃないの!?!?

subtotal は小計です。英語できない勢を見せつけていくスタイル。


しかもこの画面 fillMaxHeight なんだ。 filMaxSize じゃなくて。

どっことどっこと

あとは、ボタンタップしたときの処理としてラムダ式を渡してあげて、
画面側はそのラムダを呼び出し
呼び出し元は次の画面に遷移させる
って感じか

どっことどっこと

おそらくこの実装はAndroidViewでも同様の設計方針を成り立たせることができて
Activity を呼び出し元(つまり HogeApp
Fragment を画面(コールバックを受け取る側)
の方針としてあげればいいけど、現状 ActivityFragment 間のやりとりがなかなか面倒な実装にしかできない( FragmentListener だっけ。昔は TargetFragment だったけど)からつらいよね。

どっことどっこと

よし。各画面の onNextButtonClickednavigateを実装したので、画面遷移できるようになった。

どっことどっこと

navHostConstroller.popBackStack() を呼ぶのは、 FragmentManager の仕組みと同じ感じね。

どっことどっこと
  • navControllerbackStackを参照して現在の画面に対応するタイトルを取得
    • これはstateなので、参照するたびに値が再計算される(はず)
  • backstackがなければタイトルバーには戻る操作するためのアイコンを表示させない
    • これは canNavigateBackbool を渡しているけど、それを使って勝手に表示切り替えはやってくれなくて、CupcakeAppBar で表示処理が実装されてる。
どっことどっこと

というわけで、 Googleから提供されているCode Lab:Compose で画面間を移動する ハンズオンを実施した。
基本的にはAndroidViewでやってた FragmentManager と扱い方が近くて、FragmentManagerはtransaction (遷移)に対してtagがつけられていたけど、 NavHostController では画面にtagをつけようになったから、どの画面に遷移したいかが分かりやすくなった、という感じかな。
もう一点あげるなら、 FragmentManagerFragment からアクセスできるから各画面が好き勝手に画面遷移処理を実装できていたけど、JetpackComposeではNavHostControllerが必要で、
(ちゃんと管理していれば)各画面から好き勝手に画面遷移できないようになっている。って感じかな。

このスクラップは4ヶ月前にクローズされました