画面遷移が複雑なAndroidアプリにどう対処したか
(メモレベルの雑文なので、読みづらいかもしれません)
やりたいこと
作っていたAndrodアプリの画面遷移が複雑なため、画面遷移を一望し、条件付きの分岐を行う仕組みを作りたい。
以下のようなIoT機器の設定アプリをイメージしてください
- ある画面に出入りするパターンが複数ある
- 同じ設定用の画面を使用するが、機器登録後の初期設定 または 設定の更新のいずれかによって画面遷移が異なる
- 1つ目の機器登録か2つ目の機器登録かによって分岐
やったこと
以下を比較
1. archtecture component navigation を使用する
https://developer.android.com/topic/libraries/architecture/navigation/navigation-conditional
メリット
- 画面遷移全体をGUIで俯瞰できる
- 画面遷移の実装が比較的簡単
デメリット
- 画面遷移の条件分岐の管理はarch navigationはやってくれない
- argumentsをxmlで定義しなければならないのがちょっと嫌
- Kotlinアンチパターン のdelegatedPropertyのように、コード上で簡単にargumentを渡したかった
- 遷移方法の選定時点(2018/12)でalpha版だった。変更についてくコストがちょっとかかりそう
2. メルカリアッテを支えるオートマトンを参考にする
https://tech.mercari.com/entry/2017/11/17/161508
メリット
デメリット
- TinderStateMachineのDSLの方が好み(雑)
留意点
- Swiftの例であり、KotlinとはDSLの表現力が違う
- レシーバ付きラムダはSwiftではサポートされていない Swiftと比較しながら見る、KotlinのDSLを支える技術 - ペンギン村 Tech Blog
3. Tinder StateMachine を使用する
https://github.com/Tinder/StateMachine
メリット
- DSLが見やすくて良い
con
- ステートマシンが現在のステートを持つ実装になっている
- 画面を現在のステートとしたいので、ステートマシン自体に現在のステートを保持したくない(二重管理になってしまう)
検討結果
Tinder StateMachineの実装を参考にしつつ、現在のステートはステートマシンの外から取ってくるようにしました。
コード
https://gist.github.com/TomohikoSato/0c80441743d5aaddbdb3613cfdc3e316