android: 画面遷移しよう
2024/10/28
そろそろ終わりにしたいhirokuma/android-ble-led-control。
あまり理解できたとは言えないが DI もなんとなくやっている。
ちゃんとできているとは言えないが Data Layer を使うように変更した。
次は画面遷移である。
デバイスをスキャンする画面と、デバイスを操作する画面の 2つを持つ。
遷移するトリガーは、スキャンしたデバイス一覧から 1つ選択したときである。
こういう数量がある場合の実装は、1つ、2つ、3つ以上、の 3パターンになる場合が多いと思う。
2つだと「自分とそれ以外」で済むので 3つ以上とはまた違った実装になることがあるからだ。
今回は、メインとなるのがスキャン画面、選択したら操作画面、そこからスキャン画面へは「戻る」という実装にする。
- Compose でのナビゲーション - Jetpack Compose - Android Developers
- Compose で画面間を移動する - Codelabs
- Jetpack Compose ベースの Navigation まとめ #Android - Qiita
- ComposeでNavigationを実装する #Android - Qiita
選択したデバイスの情報を遷移先の画面に伝える必要があるのでnavArgument
を使うようにしてみた。
文字列でデバイスを識別できそうなのはアドレスだったのでそうしている。
しかし、せっかくならデバイスの情報をまるまる引き渡したい。
今は簡単な情報しか保持していないが、きっと OS からコールバックされたデータは全部持っていないといろいろアクセスできないと思うのだ。
NavHost
を使って画面遷移を定義する場合はこんな感じで画面呼び出しを作る。
複数画面で ViewModel を共有するやり方の記事があった。
なるほどねー。
共有するのは UiState だけでよいのだけど、結局画面ごとに ViewModel を作る必要があって内容もそんなに変わらないなら ViewModel を共有した方が楽か。
UiState に BLE の ScanRecord を持つようにして選択したデバイスを保存させた。
あとは接続して操作したら、一通りの目標は達成だ。