Upgrade to Pro — share decks privately, control downloads, hide ads and more …

nacatl_slide_03_AAC_Navigation_SafeArfgs.pdf

nacatl
November 27, 2019
54

 nacatl_slide_03_AAC_Navigation_SafeArfgs.pdf

nacatl

November 27, 2019
Tweet

Transcript

  1. Copyright 2018 Studyplus, Inc. All Rights Reserved.
    Jetpack Navigation の
    SafeArgsでつまずいた話
    Yuzuru Nakashima / Studyplus Inc.
    2019.11.27 @ あるあるLT Vol.08

    View full-size slide

  2. 自己紹介
    ✎ なかてぃる
    affinity_robots
    nacatl
    ✎ スタディプラスのAndroidエンジニア
    ✎ 趣味: Magic the Gathering

    View full-size slide

  3. アジェンダ
    ✎ Jetpack Navigation ライブラリ
    ✎ SafeArgsとは
    ✎ つまづいたこと
    ✎ 解決方法

    View full-size slide

  4. Jetpack Navigation ライブラリ
    Fragment画面遷移の改革

    View full-size slide

  5. Jetpack Navigation ライブラリ
    - Fragmentによる画面遷移を視覚的に
    デザインできるライブラリ
    - Fragment遷移のバックスタックとかも
    管理してくれる

    View full-size slide

  6. Jetpack Navigation ライブラリ

    View full-size slide

  7. SafeArgsとは
    What is the SafeArgs?

    View full-size slide

  8. SafeArgsとは?
    - Fragment間のBundleによるデータのput/getを
    型安全な形でラップしてくれる機能
    - getSerializable as? Hoge とか書かずに済む
    - ~~FragmentArgs という名前の
    ラッパークラスが自動生成される

    View full-size slide

  9. SafeArgsとは?

    android:name="myArg"
    app:argType="~~.~~.~~.Hoge" />


    View full-size slide

  10. SafeArgsとは?
    // 遷移元Fragmentの遷移処理箇所
    findNavController().navigate(
    XxxFragmentDirections.actionToYyy(
    myArg = Hoge()
    )
    )

    View full-size slide

  11. SafeArgsとは?
    // 遷移先Fragment
    // フィールドとしてby navArgs()で取得
    private val args: YyyFragmentArgs by
    navArgs()
    // Hoge型として型安全で中身を受け取れる
    val myArg: Hoge = args.myArg

    View full-size slide

  12. つまずいたこと
    Missteps

    View full-size slide

  13. 難読化したらInflateException出た
    つまずいたこと

    View full-size slide

  14. 難読化したらInflateException出た
    Didn’t find class ~.~.~.Hoge
    つまずいたこと

    View full-size slide

  15. つまずいたこと
    ピリオドで始めれば相対パスでも書けるらしい…

    android:name="myArg"
    app:argType=".Hoge" />

    View full-size slide

  16. 難読化しなくてもInflateException出た
    つまずいたこと

    View full-size slide

  17. 難読化しなくてもInflateException出た
    Didn’t find class {パッケージ名}.debug.Hoge
    つまずいたこと

    View full-size slide

  18. “debug”!?
    つまずいたこと

    View full-size slide

  19. つまずいたこと
    相対パスで書くと実際に動いてるアプリの
    パッケージ名の後に書いたパスが付く
    - Build Variants でSuffixとか付けてると無理
    - マルチモジュールで実際のクラスのディレクトリが
    ~~.app.{モジュール名}.Hoge とかになってても無理

    View full-size slide

  20. 解決方法
    Solutions

    View full-size slide

  21. 解決方法
    フルパスで書いて難読化対象から外そう
    - クラスに @Keep アノテーションつける
    - proguard-rules.proで -keepnames に定義する
    公式ドキュメントにもそう書かれている
    https://developer.android.com/guide/navigatio
    n/navigation-pass-data?hl=JA#proguard_conside
    rations

    View full-size slide

  22. - SafeArgsは便利だけど現状一工夫必要
    - 公式ドキュメントを逐一確認しよう

    View full-size slide

  23. ご静聴ありがとうございました

    View full-size slide