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
マッチングアプリにおけるフリックUIで苦労したこと
Search
yuhei
July 10, 2025
Programming
0
330
マッチングアプリにおけるフリックUIで苦労したこと
CA.Flutter #4 で登壇した資料です。
https://cyberagent.connpass.com/event/358111
yuhei
July 10, 2025
Tweet
Share
More Decks by yuhei
See All by yuhei
StoreKit2を使った課金システムのフルリニューアル
yuheiito
2
4.5k
Other Decks in Programming
See All in Programming
CSC509 Lecture 01
javiergs
PRO
1
430
Conquering Massive Traffic Spikes in Ruby Applications with Pitchfork
riseshia
0
150
開発者への寄付をアプリ内課金として実装する時の気の使いどころ
ski
0
350
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
160
CSC305 Lecture 02
javiergs
PRO
1
260
AIエージェント時代における TypeScriptスキーマ駆動開発の新たな役割
bicstone
4
1.5k
CI_CD「健康診断」のススメ。現場でのボトルネック特定から、健康診断を通じた組織的な改善手法
teamlab
PRO
0
180
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
ryotaros
7
1k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
120
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
230
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
140
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
150
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
890
Rails Girls Zürich Keynote
gr2m
95
14k
Balancing Empowerment & Direction
lara
4
680
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
RailsConf 2023
tenderlove
30
1.2k
Six Lessons from altMBA
skipperchong
28
4k
KATA
mclloyd
32
15k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
610
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
850
Practical Orchestrator
shlominoach
190
11k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
マッチングアプリにおける フリックUIで苦労したこと 2025/7/9 CA.Flutter #4
自己紹介 伊藤 悠平 • 株式会社CAMに中途入社 • iOSエンジニア5年、Flutterエンジニア3年目 • 2022年から株式会社タップルにジョインし、 課金リニューアルを担当
• 2023年からタップル発の 新規サービス「Koigram」に従事 • 米国株にはまってます ChatGPTに相談しながら
Koigramについて 「無料でも本気の恋はできる」をコ ンセプトにしたマッチングアプリで、 マッチもチャットも全員無料で利用 できます
• マッチングアプリにおけるフリック UIとは? • フリックとスクロール判定 • 画像ロードの工夫 主な内容
マッチングアプリにおける フリックUIとは?
マッチングアプリにおけるフリック UIとは? 左スワイプで「スキップ」
マッチングアプリにおけるフリック UIとは? 右スワイプで「いいね」
マッチングアプリにおけるフリック UIとは? 左右スワイプで「いいね/スキップ」 ChatGPTに - この図を添付 - テキストによるアルゴリズムの説明
マッチングアプリにおけるフリック UIとは? 苦労したこと 1 - 縦スクロールとの競合 縦スクロール? or 左右のスワイプ?
マッチングアプリにおけるフリック UIとは? 苦労したこと 2 - 素早い連続フリックにも耐える UI • 常にカードが表示される(何百件でも捌ける) •
常にメイン画像( 1枚目)が表示される • ネットワークが悪くてもメイン画像が表示される • 目標は1秒間に5件フリック
フリックとスクロール判定
フリックとスクロール判定 主なWidget 親Widget FlickCardsView 子Widget UserDetailView └─ SingleChildScrollView
フリックとスクロール判定 それぞれの Gesture 親Widget GestureDetector 子Widget RawGestureDetector
フリックとスクロール判定 それぞれの Gesture 子Widgetのスクロール操作より先に タッチイベントを受け取るために RawGestureDetectorを利用する
フリックとスクロール判定 親Widget - GestureDetector 親Widget GestureDetector - スキップ or いいね
のフリック判定 - 回転角度、フリック速度の計測 ※ここでは子Widgetを気にせずに実装
フリックとスクロール判定 子Widget - RawGestureDetector 子Widget RawGestureDetector - スクロールを有効にするかどうかを判定 - スワイプの角度、x/yの移動量を計測
スクロール制御の仕組み SingleChildScrollViewのphysicsを NeverScrollableScrollPhysics(スクロール無効) に切 り替えることで、親Widget側のGestureを優先させるよう にした
フリックとスクロール判定 子Widget - RawGestureDetector つまり、Gestureの状態は まず、子 WidgetのRawGestureDetectorでスワイプ方向を判定 └─ 縦方向と判定 →
physics = null(スクロール優先) └─ 横方向(フリック)と判定 → physics = NeverScrollableScrollPhysics(スクロール無効) └─ スクロールが無効状態なので、フリック操作が親 Widgetに伝わる 親Widget(GestureDetector)で 「いいね/スキップ」の処理を実行
画像ロードの工夫
画像ロードの工夫 ユーザーによる アップロード画像 様々な状況で検証した結果 ... - 最大解像度 1024 x 1024
- 最大ファイルサイズ 1MB(jpg) - Firebase Remote Configで、それぞれの値を変更できるようにした
画像ロードの工夫 連続フリックの要件 連続でフリックしても 常にメイン画像( 1枚目)が表示される
画像ロードの工夫 要件に答えられなかった ... • アップロードした画像そのままでは、連続フリックに耐えられなかった • ネットワークが悪いと、さらに処理が詰まりやすかった
画像ロードの工夫 解決策1 CachedNetworkImage • WebP + quality:60 で軽量な画像をロード (データURIスキーム) sharp:
https://sharp.pixelplumbing.com/api-resize/#resize • qualityはFirebase Remote Configで変更可能 • デバッグの計測結果を ChatGPTに渡して比較・検討し、設定を決定
画像ロードの工夫 解決策2 ロードすべき画像の優先順位 • ユーザー30件を取得後、まずメイン画像のみを優先ロード • メイン画像完了後に、先頭 2ユーザー分のサブ画像(最大 10枚)を段階ロード •
15件フリック時点で、次の 15件のユーザー情報を追加取得 • デバッグの計測結果を ChatGPTに渡して比較・検討し、設定を決定
画像ロードの工夫 解決策3 BaseCacheManagerによるStreamの監視 • ネットワークが悪いと画像のロードが詰まっていた • フリック済みユーザーの画像は不要なため、 ロード待ちの画像を即キャンセル可能に • iOSのデベロッパ機能にあるネットワークリンク調節器を
使って気がつき導入した
• ここにたどり着くまで、かなり試行錯誤を重ねた • 画像のロードなど、 Claude Codeを使えばさらに最適化できそう • 少しでも私たちの取り組みがヒントになれば嬉しいです • より良い知見があれば、ぜひ教えていただけると助かります
最後に
ご清聴ありがとうございました