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

マッチングアプリにおけるフリックUIで苦労したこと

 マッチングアプリにおけるフリックUIで苦労したこと

CA.Flutter #4 で登壇した資料です。
https://cyberagent.connpass.com/event/358111

Avatar for yuhei

yuhei

July 10, 2025
Tweet

More Decks by yuhei

Other Decks in Programming

Transcript

  1. マッチングアプリにおけるフリック UIとは? 苦労したこと 2 - 素早い連続フリックにも耐える UI • 常にカードが表示される(何百件でも捌ける) •

    常にメイン画像( 1枚目)が表示される • ネットワークが悪くてもメイン画像が表示される • 目標は1秒間に5件フリック
  2. フリックとスクロール判定 親Widget - GestureDetector 親Widget GestureDetector - スキップ or いいね

    のフリック判定 - 回転角度、フリック速度の計測 ※ここでは子Widgetを気にせずに実装
  3. フリックとスクロール判定 子Widget - RawGestureDetector 子Widget RawGestureDetector - スクロールを有効にするかどうかを判定 - スワイプの角度、x/yの移動量を計測

    スクロール制御の仕組み SingleChildScrollViewのphysicsを NeverScrollableScrollPhysics(スクロール無効) に切 り替えることで、親Widget側のGestureを優先させるよう にした
  4. フリックとスクロール判定 子Widget - RawGestureDetector つまり、Gestureの状態は まず、子 WidgetのRawGestureDetectorでスワイプ方向を判定 └─ 縦方向と判定 →

    physics = null(スクロール優先) └─ 横方向(フリック)と判定 → physics = NeverScrollableScrollPhysics(スクロール無効) └─ スクロールが無効状態なので、フリック操作が親 Widgetに伝わる 親Widget(GestureDetector)で 「いいね/スキップ」の処理を実行
  5. 画像ロードの工夫 ユーザーによる アップロード画像 様々な状況で検証した結果 ... - 最大解像度 1024 x 1024

    - 最大ファイルサイズ 1MB(jpg) - Firebase Remote Configで、それぞれの値を変更できるようにした
  6. 画像ロードの工夫 解決策1 CachedNetworkImage • WebP + quality:60 で軽量な画像をロード (データURIスキーム) sharp:

    https://sharp.pixelplumbing.com/api-resize/#resize • qualityはFirebase Remote Configで変更可能 • デバッグの計測結果を ChatGPTに渡して比較・検討し、設定を決定