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
MVVM から MVVM-C に変えてみた話 〜画面遷移どうしてる?〜
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ricky-yu
November 18, 2025
Programming
300
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
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
170
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
470
不幸な GC
chencmd
0
890
バグを直したら useEffect が消えた
colorful12
3
840
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
160
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
2
500
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
500
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
170
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
36k
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
So, you think you're a good person
axbom
PRO
2
2.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
How to Ace a Technical Interview
jacobian
281
24k
Building AI with AI
inesmontani
PRO
1
1.2k
RailsConf 2023
tenderlove
30
1.5k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
680
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The agentic SEO stack - context over prompts
schlessera
0
900
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 出展中
以上 ありがとうございました。