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
チームで採用しているriverpodを使ったFlutterのアーキテクチャとriverpod ...
Search
Kakeru Nakabachi
August 06, 2021
Programming
5k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
チームで採用しているriverpodを使ったFlutterのアーキテクチャとriverpod v1.0.0
Kakeru Nakabachi
August 06, 2021
More Decks by Kakeru Nakabachi
See All by Kakeru Nakabachi
Flutterアプリで可用性を向上させたFeatureFlagの運用戦略とその方法
b4tchkn
0
2k
Inside Flutter Text
b4tchkn
1
310
Flutterアプリのセキュリティ対策を考えてみる
b4tchkn
6
8.3k
Textの構造を理解する/Understanding the Structure of Text
b4tchkn
3
2.8k
Other Decks in Programming
See All in Programming
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
Building an Out-of-Order CPU
latte72
1
780
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
270
一人だけ、Kiroが静止する日
hideg
0
110
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
720
SREの越境 / SRE Collaboration
y0hgi
2
220
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
220
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
新卒PdEのリアル
ryu1013
1
500
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
110
Featured
See All Featured
Visualization
eitanlees
152
17k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
890
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
Accessibility Awareness
sabderemane
1
210
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
240
Bash Introduction
62gerente
615
220k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Transcript
チームで採用しているriverpodを使った Flutterのアーキテクチャとriverpod v1.0.0 b4tchkn Flutter x Kotlin Multiplatform by CyberAgent
#4 2021/08/06 #ca_flutter_kmm
About me Kakeru Nakabachi batch(@b4tchkn) 2
今日のゴール • ちょっとこの部分参考にできるかも • riverpodで状態管理いいかも • CAもFlutterで色々やってるんだな👀 3
アジェンダ • riverpodの簡単な紹介 • チームのFlutterプロジェクトアーキテクチャ • riverpod使用ルールについて 4
riverpod 5
• もともとあった、Providerという状態管理ライブラリの問題点を解消したやつ • DIもこれで実現できる • テスタブルなコードを保証してくれる • 最近 v1.0.0に乗り換え •
hooks_riverpod • flutter_riverpod • riverpod https://riverpod.dev/docs/getting_started/ riverpod 6
• もともとあった、Providerという状態管理ライブラリの問題点を解消したやつ • DIもこれで実現できる • テスタブルなコードを保証してくれる • 最近 v1.0.0に乗り換え •
hooks_riverpod • flutter_riverpod • riverpod https://riverpod.dev/docs/getting_started/ riverpod 7
hooks_riverpod flutter_hooksと併用する使い方 HookConsumerWidgetを使って中でref.watchなど便利メソッドが呼べる 8
hooks_riverpod 公式にも載ってる簡単なサンプル 9
hooks_riverpod riverpodを使うプロジェクトではAppを ProviderScopeでラップする 10
hooks_riverpod Stringを配るProvider 11
hooks_riverpod ProviderをWidget内で監視 12
hooks_riverpod riverpod v1.0.0での割と大きな変更点 13
チームのFlutterアーキテクチャ 14
全体像 15 UI State Domain Data
全体像 16 UI State Domain Data
• Service ◦ DioとRetrofitを使った RemoteDataSource ◦ 定義したabstract class(interface)から実 際にリクエストするコードを生成 •
Database ◦ SharedPreferencesを使った LocalDataSource ◦ Key - Valueでデータを永続化 同ドメインに関わる複数のメソッドを定義できる getArticle(String id)とか Data 17
Data • 実際にリクエストするメソッド 18
Data • Dioの依存をriverpodのProviderを使ってDI • Dioに依存したdatasourceのインスタンスをProviderで配布 19
全体像 20 UI State Domain Data
Domain ビジネスオブジェクトを含む、アプリケーションの中核となるレイヤー メソッドは1つしか実装できない UseCaseは他のUseCaseへの参照はできない Stateが複数UseCaseを持つのはOK 21
Domain UseCaseはDataSourceに依存 22
Domain UseCaseはDataSourceに依存 DataSourceで定義したProviderを 使ってUseCaseのインスタンスを配 布する際にDIして提供する 23
Domain DataSourceのコールにパラメータが必要 な場合 24
Domain DataSourceのコールにパラメータが必要 な場合 パラメータが1つでもUseCaseParamのオ ブジェクトを作ってUseCaseに渡す 25
全体像 26 UI State Domain Data
State 1つの状態だけを持つViewModel的な存在 Recoilの思想を取り入れて、1つのStateの粒度を可能な限り小さくする 27 https://recoiljs.org/
State StateのProviderを作る時はStateNotifierProviderを使う 28
State 29 トップ画面 記事一覧画面
State UseCaseの依存解決にParamが必要な場合 familyを使ってProviderを作るパラメータを増やす このときParamが変更されると古いParamを持ったProviderは再利用されず溜まってい き、メモリリークの原因となるためautoDisposeもセットで使う 30
Selector Stateをなにかしら計算してUIに渡したいときに定義 複数のStateを参照して計算した値をSelectorで定義してUIに配布もできる 31
State よくあるStateの動き 32
State よくあるStateの動き 33 loading Request Request
よくあるStateの動き State 34 loading Data Data
State よくあるStateの動き 35 idle(loaded) Data Data Data
State よくあるStateの動き(異常系) 36 idle(loaded) Error Data Data
State これらの状態をAsycEntity、 AsyncStateNotifierで表現 37
全体像 38 UI State Domain Data
UI - Connected Screen StatefulなPage StateとStatelessなHogePageを繋ぎこむ役目 StateProviderの保持と、loadingなどの状態に よってWidgetを出し分けるため DefaultContainerでAsyncEntityの値を処理す る
39
UI - Connected Screen DefaultContainer Stateから渡ってきた複数のAsyncEntityの値を処理してWidgetの出し分けを担う 40 ロード中 ロード終了 エラー発生
UI - Stateless Screen StateをもたないWidget群 • ListView • TextView •
Container • Column • … 41
riverpod使用ルール 42
riverpod使用ルール Providerの作り方はたくさんある • Provider • StreamProvider • StateProvider • StateNotifierProvider
• FutureProvider https://riverpod.dev/docs/concepts/providers 43
Providerのreadの仕方もいっぱいある https://riverpod.dev/docs/concepts/reading riverpod使用ルール 44
riverpod使用ルール ルール①:FutureProvider / StreamProviderの代わりに StateNotifierProvider+AsyncStateNotifier 45 NG OK
riverpod使用ルール ルール②:StateProviderの代わりにStateNotifierProvider+StateController 46 NG OK
riverpod使用ルール ルール③:Provider作成時はref.readは使わないでref.watchのみで統一 47 NG OK
riverpod使用ルール ▪ まとめ 1. FutureProvider / StreamProviderの代わりに StateNotifierProvider+AsyncStateNotifier 2. StateProviderの代わりにStateNotifierProvider+StateController
➢ プロジェクトで使うProviderをProviderとStateNotifierProviderに制限 3. Provider作成時はref.readは使わないでref.watchのみで統一 ➢ 依存しているProviderが再生成されたときに、変化した値を購読できるよ うにするため ➢ 設計の統一性、Providerの依存を見やすくする 48
参考リンク 49 • https://riverpod.dev/docs/getting_started • https://recoiljs.org/ • https://zenn.dev/riscait/books/flutter-riverpod-practical-introduction/viewer/mig rate-to-v1
Thank you 50