Compose で画面間を移動する
NavHost
を使ってその辺を実装するんだって。
Navigation のコンポーネントには3つの要素で構成されていて
-
NavController
:画面遷移を実際に処理する -
NavGraph
: 画面遷移を定義する(どの画面間に繋がりがあるかを定義する) -
NavHost
:コンポーサブル。NavControllerが管理している現在の画面を表示する
ってことなのかな。
カタカナで ルート
だと route
なのか root
なのかわからないけど、読んでいくと route
なのかなと思える。
で、そのルートは文字列管理なので、列挙子で管理するとイイヨという話なのかな。
おーん composable
関数が参照できないぞ。
import androidx.navigation.compose.composable
が明示してあるわ...
注: composable() 関数は NavGraphBuilder の拡張関数です。
と言われても、だから何?という...
お、 NavHost
の import
が間違えてるぽいぞ。
import androidx.navigation.compose.NavHost
でimportを書き換えたら composable
が参照できるようになった
AndroidStudioが悪いのか、コード補完が全然動いてない...
StartOrderScreen
が表示されないな
StartOrderScreen が表示されないな
import
の件でinvalidate してたから、キャッシュがクリアされてたからかな。
ビルドしなおしたら直った。
うーん。 NavHost
にその NavigationController
が管理する route
を一通り登録しておくようなイメージなのかな。
受け取り日画面はフレーバー画面に似ています。唯一の違いは、SelectOptionScreen コンポーザブルに渡されるデータです。
うんうん。
composable()
関数を再度呼び出し、route
パラメータにCupcakeScreen.Pickup.name
を渡します。
うんうん。
後置ラムダで、
SelectOptionScreen
コンポーザブルを呼び出し、前と同じようにsubtotal
にuiState.price
を渡します。
うん!?!?!?!?受取日ならdateじゃないの!?!?
subtotal
は小計です。英語できない勢を見せつけていくスタイル。
しかもこの画面 fillMaxHeight
なんだ。 filMaxSize
じゃなくて。
あとは、ボタンタップしたときの処理としてラムダ式を渡してあげて、
画面側はそのラムダを呼び出し
呼び出し元は次の画面に遷移させる
って感じか
おそらくこの実装はAndroidViewでも同様の設計方針を成り立たせることができて
Activity
を呼び出し元(つまり HogeApp
)
Fragment
を画面(コールバックを受け取る側)
の方針としてあげればいいけど、現状 Activity
と Fragment
間のやりとりがなかなか面倒な実装にしかできない( FragmentListener
だっけ。昔は TargetFragment
だったけど)からつらいよね。
よし。各画面の onNextButtonClicked
にnavigate
を実装したので、画面遷移できるようになった。
navHostConstroller.popBackStack()
を呼ぶのは、 FragmentManager
の仕組みと同じ感じね。
別のアプリに移動する
これは、AndroidViewも同じIntentを発火させるだけ。
唯一把握しておくべきことは、 context
を LocalContext.current
から取得するということだけ。かな。
@StringRes
はいまだに健在なのね。
-
navController
のbackStack
を参照して現在の画面に対応するタイトルを取得- これはstateなので、参照するたびに値が再計算される(はず)
-
backstack
がなければタイトルバーには戻る操作するためのアイコンを表示させない- これは
canNavigateBack
でbool
を渡しているけど、それを使って勝手に表示切り替えはやってくれなくて、CupcakeAppBar
で表示処理が実装されてる。
- これは
というわけで、 Googleから提供されているCode Lab:Compose で画面間を移動する ハンズオンを実施した。
基本的にはAndroidViewでやってた FragmentManager
と扱い方が近くて、FragmentManagerはtransaction
(遷移)に対してtagがつけられていたけど、 NavHostController
では画面にtagをつけようになったから、どの画面に遷移したいかが分かりやすくなった、という感じかな。
もう一点あげるなら、 FragmentManager
は Fragment
からアクセスできるから各画面が好き勝手に画面遷移処理を実装できていたけど、JetpackComposeではNavHostController
が必要で、
(ちゃんと管理していれば)各画面から好き勝手に画面遷移できないようになっている。って感じかな。