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

Flutter Add To ANDPAD App

くどう
October 22, 2020

Flutter Add To ANDPAD App

くどう

October 22, 2020
Tweet

More Decks by くどう

Other Decks in Programming

Transcript

  1. Flutter Add To ANDPAD App Copyright © 2020 Present ANDPAD

    Inc. This information is confidential and was prepared by ANDPAD Inc. for the use of our client. It is not to be relied on by and 3rd party. Proprietary & Confidential 無断転載・無断複製の禁止 potatotips #71
  2. 自己紹介 - kotaro.kudo - 株式会社アンドパッド アプリ開発チーム - GitHub: ham-burger -

    Twitter: derakudo - SIerで金融システム開発→別の会社でtoCアプリ開発→現職 - Flutterはここ3ヶ月くらい
  3. アジェンダ 1. Add To App 2. モチベーション 3. なぜReact Nativeじゃないのか

    4. 実装方法 5. 良かったこと 6. 悩んだこと 7. 残課題 8. ドキュメントをちゃんと読んでおけば・・・ 9. 今後の展望
  4. 良かったこと - 開発スピードが上がった - hot reloadがあるのでビルド待ちが少ない - モジュール単体で動作確認できるように debug用画面を用意しておく -

    特にiOSネイティブは開発中のビルド待ち時間が長いイメージ - 実装差分を気にするコストは無くなった
  5. 悩んだところ - モジュール化の単位(Viewだけ?画面ごと?) - アプリ共通の処理は既にネイティブ側で実装済みなのでそれを活用するか迷った - 今回の画面でいうとhttpなど - 今回は認証トークンなど最低限のデータのみ連携して呼び出せるようにした -

    テストもFlutterにまとめたかった V VM M V Android Flutter V M V M VM ネイティブ側でアレコレせずに ... 最低限のデータ 全部のデータ Flutter側で完結するようにする 似たような 共通クラス
  6. 残っている課題 - Flutterの状態管理は必要 - Add To App自体はFlutter Moduleを呼び出すだけで、画面遷移をマネジメントしてくれるわけでは ない -

    呼び出し直後は透過、 MethodChannelで画面遷移させた後に fadeで表示させている - ベストプラクティスがまだわからない A B C A A C Android Flutter Androidの画面遷移に追従して いないので、そのままだと前回 呼び出した画面のまま
  7. 残っている課題 - クリーンビルドが遅くなった - CIがなんか遅いとの苦情が - FlutterとAndroidどちらもビルドするから - 未解決。神待ち -

    アプリサイズが大きくなった - AndroidではAPKで40MBほど - AABだともう少し小さい?(未確認) - toCだとDynamic feature moduleなど使ってインストールコストを下げる工夫が必要かもしれない
  8. 実装方法 - setting.gradle include ':app' // assumed existing content rootProject.name

    = "My Application" setBinding(new Binding([gradle: this])) // new evaluate(new File( // new settingsDir.parentFile, // new 'my_flutter/.android/include_flutter.groovy' // new ))
  9. 実装方法 - Flutter engineの有効化 class AndpadApplication : MultiDexApplication() { lateinit

    var flutterEngine: FlutterEngine override fun onCreate() { super.onCreate() flutterEngine = FlutterEngine(this) flutterEngine.dartExecutor.executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ) FlutterEngineCache .getInstance() .put("flutterEngine", flutterEngine) } }
  10. 実装方法 - ActivityでFlutter画面起動 - FlutterはFragmentとして起動したほうが扱いやすい気がする class SampleActivity : AppCompatActivity() {

    private val flutterEngine by lazy { (applicationContext as AndpadApplication).flutterEngine } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val fragment: FlutterFragment = FlutterFragment .withCachedEngine("flutterEngine") .build() supportFragmentManager .beginTransaction() .add(R.id.container, fragment) .commitNow() } }
  11. 実装方法 - MethodChannel経由でルーティングと必要な情報の連携 private val methodChannel by lazy { MethodChannel(flutterEngine.dartExecutor,

    "methodChannel") } val arguments = mutableMapOf( // 起動画面判別用のパス "path" to "/sample_paging_list", ).apply { // 共通パラメータ(認証トークンetc) putAll(getMappedFlutterHttpClientParams()) } // Fragment起動後にFlutterに画面遷移を通知 methodChannel.invokeMethod("navigate", arguments)
  12. 実装方法 - Flutter側のルーティング処理 case "navigate": final arguments = call.arguments; String

    path = arguments["path"].toString(); switch (path) { case "sample_paging_list": // 画面Object生成処理 default: return null; }
  13. 実装方法 - 画面にデータを連携する処理 case "sample_paging_list": final accessToken = arguments["access_token"] as

    String; return Navigator.of(context) .push(MaterialPageRoute(builder: (context) { final itemId = arguments["item_id"] as int; return SamplePagingListScreen( accessToken: accessToken, itemId: itemId); }));