Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MVVM から MVVM-C に変えてみた話 〜画面遷移どうしてる?〜
Search
Ricky-yu
November 18, 2025
Programming
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MVVM から MVVM-C に変えてみた話 〜画面遷移どうしてる?〜
Ricky-yu
November 18, 2025
Other Decks in Programming
See All in Programming
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
250
カツオ、ご期待ください
suneo3476
0
120
Agents on Rails - Rails at Scale 2026
irinanazarova
0
290
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
28
11k
iOSDCのペンライトを自動制御したい!
akkeylab
0
140
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
140
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
330
一人だけ、Kiroが静止する日
hideg
0
140
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
980
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
280
FreeBSDでZabbixを動かす
kenkino
0
340
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
25k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
590
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
340
Facilitating Awesome Meetings
lara
57
7.2k
Making the Leap to Tech Lead
cromwellryan
135
10k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
WCS-LA-2024
lcolladotor
0
840
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
Transcript
MVVM から MVVM-C に変えてみた話 〜 画面遷移どうしてる?〜
1. MVVMのおさらい 2. 実際どんな構成になったか 3. 事例の紹介 4. なぜCoordinatorがいるのか? 5. 導入に当たって検討すべきこと
自己紹介 - iOSエンジニア-> 現在Flutterエンジニア 株式会社Linc’well - 前職iOS開発経験では(MVC→VIPER への移行経験あり) - Flutterの個人開発でも仕事でもMVVMアーキテクチャ 陳 信瑜
GitHub ID: Ricky-yu
MVVM構成の復習 ・UIロジックとビジネスロジックを分離できるメ リット ・ただし「画面遷移の責務」はどこに置くかが 曖昧になりがち Model データ構造とビジネスロジックを担当 アプリケーションのデータ操作と永続化を処理 View UIコンポーネントとユーザー操作の受付
Flutter Widgetとして実装 ViewModel ビューの状態管理とビジネスロジック連携 Riverpodプロバイダーとして実装
MVVM課題の整理(責務が混在/テスト困難) ・ViewModelがUI遷移まで担当してしまう ・画面遷移は Viewにあるとテストしづらい ・画面遷移が増えるほどメンテナンスコスト増 ・外部リンク遷移がビジネスロジックに混ざり、保守性低下
MVVM-Cの導入アイデア ・iOS開発でMVC→VIPERへ移行した際も「遷移の責務分離」は共通課題 ・Flutterにも同じ思想を応用できるのでは? ・MVVMにCoordinatorを追加して遷移を一元管理できるのでは?( MVVM-C)
MVVM-C フレームワークの基本構造 MVVMCはModel-View-ViewModel-Coordinatorの略で、 従来のMVVMパターンにCoordinatorレイヤーを追加したアーキテクチャです。 View Coordinator 画面遷移とアプリフロー制御 ナビゲーション責務の一元管理 ViewModel Model
取り組んだ事例
実例1:画面遷移テストの実施が困難 class _HomeViewState extends State<HomeView> { onTap: () async {
// ❌ 問題:onTap 内で非同期処理+画面遷移を直接実装 // 処理状態のダイアログを表示。 CommonUtils.showProgressDialog(context); // 2秒待機、ダイヤログを消す。 await Future<dynamic>.delayed(Duration(seconds: 2)); Navigator.of(context).pop(); // 次の画面へ遷移する。 Get.to(BirthdayTestView(), }, }
画面遷移テスト(Before) testWidgets('HomeView Test', (WidgetTester tester) async { getPages: [ //
❌ ルーティング設定 が必要です。 GetPage(name: '/birthday', page: () => BirthdayTestView()), GetPage(name: '/fingerprint', page: () => FingerPrintTestView()), ], await tester.tap(find.text('Date_Fortune_Tell'.tr)); await tester.pump(Duration(seconds: 2)); // ❌ 2秒を待つ必要。 await tester.pumpAndSettle(); //❌ アニメーション完了を 待つ必要。 // ❌ 正しいページに遷移したかどうかを検証するのが難しい。 expect(find.byType(BirthdayTestView), findsOneWidget); }
画面遷移テスト(After)画面遷移テストがシンプル・高速・安定に testWidgets('HomeView Test(Mock Coordinator)', (WidgetTester tester) async { final mockCoordinator
= MockHomeCoordinator(); Get.put<HomeCoordinator>(mockCoordinator); // ✅ View 本体だけをテストすればよい await tester.pumpWidget( GetMaterialApp(home: HomeView()), ); // ✅ ボタンをタップするだけに await tester.tap(find.text('Date_Fortune_Tell'.tr)); // ✅ 正しい Coordinator のメソッドが呼び出されたかを検証する verify(mockCoordinator.navigateToBirthdayTest()).called(1); }
実例2:同一フロー内で遷移管理が分散 HomeView TestList View TestList DetailView TestResult View 画面遷移 テスト
画面遷移 テスト 画面遷移 テスト 画面遷移 テスト
実例2:同一フロー内で遷移管理が分散(After) HomeView TestList View TestList Detail View TestResul tView 画面遷移テスト
TestFlowCoordinator
なぜCoordinatorがいるのか? ・UIに依存しない、遷移ロジックの検証が可能。 ・遷移ロジックを集中管理できます。 ・遷移の追跡がしやすくなります。
導入にあたって検討すべきポイント • 画面遷移の依存関係 現在の画面遷移は View または ViewModel のどちらに依存しているかを確認する。 (View に依存している
→ Coordinator 導入の効果が大きい) • 遷移経路の複数性 複数のフローからその画面に遷移される可能性があるかを確認する。 (例:通知/ディープリンク/通常遷移など) • 遷移ロジックの複雑さ 条件分岐や状態管理を伴う遷移ロジックが複雑になっていないかを確認する。 • チーム方針 アーキテクチャは「正解」ではなく「哲学」。 チームの開発方針・保守性・テスト戦略に合わせて実装方針を検討する。
16 ©Linc' well inc. クリフォアアプリについて クリフォアアプリ • Linc’wellが提供するサービスをまとめたアプリ • オンライン・オフラインの診療予約
• ヘルスケア製品の購入 • 服薬管理機能 • 体重管理サポート • MVVM+Coordinator導入中 • Flutterエンジニア採用中 • FlutterKaigi 2025 出展中
以上 ありがとうございました。