Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マッチングアプリにおけるフリックUIで苦労したこと
Search
yuhei
July 10, 2025
Programming
0
400
マッチングアプリにおけるフリック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
5k
Other Decks in Programming
See All in Programming
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.3k
sbt 2
xuwei_k
0
200
How Software Deployment tools have changed in the past 20 years
geshan
0
28k
エディターってAIで操作できるんだぜ
kis9a
0
660
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
400
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
230
React Native New Architecture 移行実践報告
taminif
1
130
AIコードレビューがチームの"文脈"を 読めるようになるまで
marutaku
0
310
All(?) About Point Sets
hole
0
280
dotfiles 式年遷宮 令和最新版
masawada
1
680
FluorTracer / RayTracingCamp11
kugimasa
0
200
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
19k
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Facilitating Awesome Meetings
lara
57
6.7k
A Tale of Four Properties
chriscoyier
162
23k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Automating Front-end Workflow
addyosmani
1371
200k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
80
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
It's Worth the Effort
3n
187
29k
Building an army of robots
kneath
306
46k
Code Reviewing Like a Champion
maltzj
527
40k
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を使えばさらに最適化できそう • 少しでも私たちの取り組みがヒントになれば嬉しいです • より良い知見があれば、ぜひ教えていただけると助かります
最後に
ご清聴ありがとうございました