Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
安全にNavigateしよう
Search
ゆつぼ
April 21, 2023
Technology
0
380
安全にNavigateしよう
Shibuya.apk#41
ゆつぼ
April 21, 2023
Tweet
Share
More Decks by ゆつぼ
See All by ゆつぼ
DAI語で行こう #as_tips / daigo_as_tips
morayl
1
390
Other Decks in Technology
See All in Technology
検証からプロダクトへ: シームレスなLLM開発の ためのしくみ作り
nunukim
1
170
期待しすぎずに取り組む両面 TypeScript
shozawa
2
300
データマネジメントを支える武器としてのメタデータ管理
10xinc
1
530
OCI Data Integration技術情報 / ocidi_technical_jp
oracle4engineer
PRO
1
1.5k
沒想過的前端錯誤處理可能比你有做的還多
line_developers_tw
PRO
0
2k
SREsのためのSRE定着ガイド
netmarkjp
10
1.6k
やっていきテスト
k6s4i53rx
0
160
サービス成長と共に肥大化するモノレポ、長くなるCI時間 / As services grow, monorepos get bigger and CI time gets longer
kohbis
5
2.1k
業務で使えるかもしれない…!?GitHub Actions の Tips 集 / CI/CD Test Night #7
ponkio_o
PRO
24
7k
プッシュ型子育てサービスを、先行プロジェクト実施自治体において開始します
govtechtokyo
0
250
GraphQLに入門してみた
chiroruxx
2
120
Evolutionary Optimization of Model Merging Recipes
fuyu_quant0
3
520
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
350
18k
Navigating Team Friction
lara
177
13k
The Illustrated Children's Guide to Kubernetes
chrisshort
28
46k
Rails Girls Zürich Keynote
gr2m
91
13k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
6.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
19
1.9k
The Pragmatic Product Professional
lauravandoore
24
5.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
124
32k
Stop Working from a Prison Cell
hatefulcrawdad
265
19k
Large-scale JavaScript Application Architecture
addyosmani
501
110k
Imperfection Machines: The Place of Print at Facebook
scottboms
257
12k
Transcript
安全にNavigateしよう ゆつぼ@morayl1
自己紹介 • ゆつぼ(@morayl1) • 個人:Footprint(https://github.com/morayl/Footprint) • 仕事:2年間に及ぶ大規模Androidアプリのリニューアルを終えた • うつぼとうなぎが好き
Navigationライブラリ使ってますか? • Navigationをより安全にするinterfaceを作った話 • Fragmentの中でnavigateしている場合 • Composeの時代なので流行りの話ではない
nav_graph.xml
Navigateする方法①:idを使う • nav_graphに定義していないidを指定できてしまう • 間違えてもビルドは通る • SafeArgsが活きない • idとArgsの組み合わせを誤ると、実行時に落ちる
Navigateする方法②:Directionsを使う • 遷移アクションを間違えづらい(Directionsに生えているものしか出来ない) • Directionsを間違える可能性は残る(遷移先を選ぶときに気付ける) • Fragmentの名前が長くなると、Directionsも長くなる • SafeArgsは活きる
Directionsの仕組み nav_graphの<fragment>のidに対応したDirectionsクラスが自動生成される <fragment>内のアクションはcompanion objectに生成されている
いまいちな点まとめ • id・argsを間違える可能性 • 間違えてもビルドは通る • Directionsを間違える可能性は残る(遷移先を選ぶときに気付ける) • Fragmentの名前が長くなると、Directionsも長くなる
Navigatable Github
Navigatable Github Tには、FragmentDirections.Comanionを指定
実装側(Fragment) • navigateラムダ内でアクションが補完表示される • nav_graphに定義していない遷移が出来ない • Directionsを使っているので引数も誤らない • Directionsを空で書くのは1度だけ •
遷移時にxxDirectionsが不要なので短い!読みやすい!(個人の感想)
Navigatable
try/catch • リストなどで同時押しされて遷移する場合(FragmentA→FragmentB)、一回目のク リック処理でBに遷移した後二回目の処理時にBに遷移しようとする • が、すでにBに遷移しているため、B→Bの遷移が定義されていないと IllegalArgumentExceptionが発生する • Exceptionを用いずに、 findNavController().currentDestination?.getAction(directions.actionId)
でnullチェックすることでも回避できる A B B
まとめ Navigatableを使うと、安全・簡潔にnavigate出来ます! Navigatable.kt