Slide 1

Slide 1 text

安全にNavigateしよう ゆつぼ@morayl1

Slide 2

Slide 2 text

自己紹介 ● ゆつぼ(@morayl1) ● 個人:Footprint(https://github.com/morayl/Footprint) ● 仕事:2年間に及ぶ大規模Androidアプリのリニューアルを終えた ● うつぼとうなぎが好き

Slide 3

Slide 3 text

Navigationライブラリ使ってますか? ● Navigationをより安全にするinterfaceを作った話 ● Fragmentの中でnavigateしている場合 ● Composeの時代なので流行りの話ではない

Slide 4

Slide 4 text

nav_graph.xml

Slide 5

Slide 5 text

Navigateする方法①:idを使う ● nav_graphに定義していないidを指定できてしまう ● 間違えてもビルドは通る ● SafeArgsが活きない ● idとArgsの組み合わせを誤ると、実行時に落ちる

Slide 6

Slide 6 text

Navigateする方法②:Directionsを使う ● 遷移アクションを間違えづらい(Directionsに生えているものしか出来ない) ● Directionsを間違える可能性は残る(遷移先を選ぶときに気付ける) ● Fragmentの名前が長くなると、Directionsも長くなる ● SafeArgsは活きる

Slide 7

Slide 7 text

Directionsの仕組み nav_graphののidに対応したDirectionsクラスが自動生成される 内のアクションはcompanion objectに生成されている

Slide 8

Slide 8 text

いまいちな点まとめ ● id・argsを間違える可能性 ● 間違えてもビルドは通る ● Directionsを間違える可能性は残る(遷移先を選ぶときに気付ける) ● Fragmentの名前が長くなると、Directionsも長くなる

Slide 9

Slide 9 text

Navigatable Github

Slide 10

Slide 10 text

Navigatable Github Tには、FragmentDirections.Comanionを指定

Slide 11

Slide 11 text

実装側(Fragment) ● navigateラムダ内でアクションが補完表示される ● nav_graphに定義していない遷移が出来ない ● Directionsを使っているので引数も誤らない ● Directionsを空で書くのは1度だけ ● 遷移時にxxDirectionsが不要なので短い!読みやすい!(個人の感想)

Slide 12

Slide 12 text

Navigatable

Slide 13

Slide 13 text

try/catch ● リストなどで同時押しされて遷移する場合(FragmentA→FragmentB)、一回目のク リック処理でBに遷移した後二回目の処理時にBに遷移しようとする ● が、すでにBに遷移しているため、B→Bの遷移が定義されていないと IllegalArgumentExceptionが発生する ● Exceptionを用いずに、 findNavController().currentDestination?.getAction(directions.actionId) でnullチェックすることでも回避できる A B B

Slide 14

Slide 14 text

まとめ Navigatableを使うと、安全・簡潔にnavigate出来ます! Navigatable.kt