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
How to use provider package
Search
makicamel
July 16, 2019
Programming
1k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How to use provider package
makicamel
July 16, 2019
More Decks by makicamel
See All by makicamel
dRuby over BLE
makicamel
2
500
Road to RubyKaigi: Play Hard(ware)
makicamel
1
1.3k
First step to PicoRuby
makicamel
2
720
PicoRuby on Rails
makicamel
4
350
Take a small step beyond the api
makicamel
2
240
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1.9k
Road to RubyKaigi
makicamel
4
740
Rails アプリ地図考 Flush Cut
makicamel
1
250
ErdMap: Thinking about a map for Rails applications
makicamel
2
4.3k
Other Decks in Programming
See All in Programming
SREの越境 / SRE Collaboration
y0hgi
2
290
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
iOSDC2026登壇資料.pdf
riofujimon
0
200
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
270
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
150
JRuby: Past, Present, and Future
headius
0
220
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
120
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
Tell your own story through comics
letsgokoyo
1
1.1k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Claude Code のすすめ
schroneko
67
230k
Fireside Chat
paigeccino
43
4k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Transcript
ͰΘ͔Δ ΏΔ;ΘQSPWJEFSೖ 2019.7.16. Flutter Meetup Tokyo #10 @makicamel ͍ํ
ࣗݾհ •@makicamel / ݪສق •גࣜձࣾGaiax •Flutterྺ3ϲ݄͘Β͍ •Ruby ͱϏʔϧɹɹͱ͓ञ͕͖
ࣗݾհ
•ڥքͱͯ͠ࠓਂ0࣌ͷDateTimeΠϯελϯε͕΄͍͠ DateCalc.now().beginningOfDay(); •aͱb͕ಉ͔͡Ͳ͏͔ఆ͍ͨ͠ a.isSameDay(b); •c͕Կϲ݄લͳͷ͔Λऔಘ͍ͨ͠ c.differenceValue(type: DateType.month); •1ޙͷࠓͷΛग़͍ͨ͠ DateCalc.now().addYear(1); date_calc
provider
provider ? •͍··ͰͷStateཧͷཱऀ •scoped model •BLoC •Rx •Stream → ͪΐͬͱΓͳ͍
→ ͪΐͬͱෳࡶ͗͢Δ
provider ? •scoped modelʹۙ͘ɺػೳΛ૿ͨ͠ͷ͕provider Google I/O 2019Ͱprovider͕Googleެࣜਪʹ ͍·ผͷํ๏Λ͍ͬͯΔਓ ແཧʹม͑ͳ͍͍ͯ͘Αʂ
৽࢝͘͠ΊΔͳΒ provider͕அવΦεεϝ✨ 1SBHNBUJD4UBUF.BOBHFNFOUJO'MVUUFS (PPHMF*0 IUUQZPVUVCFE@NDTNSG* ."5546--*7"/
State 4UBSUUIJOLJOHEFDMBSBUJWFMZcqVUUFSEFW IUUQTqVUUFSEFWEPDTEFWFMPQNFOUEBUBBOECBDLFOETUBUFNHNUEFDMBSBUJWF એݴత
•ୡ͖͢త(ग़ྗ)Λࣔ͠ ࣮ݱ͢Δखଓ͖γεςϜʹ ͤΔ •ཉ͍͠σʔλ Λهड़ •ॲཧํ๏Θͳ͍ એݴܕ / ໋ྩܕ •తΛୡ͢ΔͨΊͷํ๏
Λʮखଓ͖ʯͱͯࣔ͢͠ •ॲཧɾऔಘํ๏ Λهड़ •࣮ߦ໋͖͢ྩྻͰ ߏ͞ΕΔ IUUQTKBXJLJQFEJBPSHXJLJએݴܕϓϩάϥϛϯά IUUQTKBXJLJQFEJBPSHXJLJ໋ྩܕϓϩάϥϛϯά ͪͳΈʹ3VCZ ΦϒδΣΫτࢦΛಋೖ໋ͨ͠ྩܕݴޠ How What
class SomeWidget extends StatefulWidget { SomeWidgetState state; SomeItem value; @override
createState() => state = SomeWidgetState(); void updateWidget() => state.updateState(); } class SomeWidgetState extends State<SomeWidget> { void updateState() { setState(() {}); } @override Widget build(BuildContext context) { return SomeAwesomeWidget(...); } } એݴܕ / ໋ྩܕ
class AnotherWidget extends StatelessWidget { @override Widget build(BuildContext context) {
return FlatButton( child: Text('PUSH'), onPressed: () { var widget = SomeWidget() ..value = someItem ..updateWidget(); }, ); } } એݴܕ / ໋ྩܕ
4JNQMFBQQTUBUFNBOBHFNFOUcqVUUFSEFW IUUQTqVUUFSEFWEPDTEFWFMPQNFOUEBUBBOECBDLFOETUBUFNHNUTJNQMF એݴܕ / ໋ྩܕ 1SBHNBUJD4UBUF.BOBHFNFOUJO'MVUUFS (PPHMF*0 IUUQZPVUVCFE@NDTNSG* •AnotherWidget͕SomeWidgetΛΓ͍͗ͯ͢Δ
ΞϓϦ͕େ͖͘ͳΔͱΩπ͍ •Ͳ͜ͰState͕มߋ͞ΕΔ͔Θ͔Βͳ͍ ΞϓϦΛcrashͤ͞ΔՄೳੑ͕͋Δ
એݴܕ / ໋ྩܕ 4JNQMFBQQTUBUFNBOBHFNFOUcqVUUFSEFW IUUQTqVUUFSEFWEPDTEFWFMPQNFOUEBUBBOECBDLFOETUBUFNHNUTJNQMF UIΞϓϦέʔγϣϯͷঢ়ଶ(state)Λ Ϗϧυܾͯ͠·Δͷ
void someHandler() { final items = somehowGetMyItems(); items.add(myAwesomeItem); } class
SomeWidget extends StatelessWidget { @override Widget build(BuildContext context) { var items = somehowGetMyItems(context); return SomeAwesomeWidget(...); } } એݴܕ / ໋ྩܕ providerͷग़൪ UIͱ stateͷ
࣮ͯ͠ΈΑ͏
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ
ϨετϥϯͷਥͰΦʔμʔ͕ฒͿ͜Μͳ൘ Πϝʔδਤ ΦϜϨπ ×1 εʔϓ ×1 A ΤϏϑϥΠ ×2 ϥΠε
×2 B ϋϜΧπ ×1 ΤϏϑϥΠ ×2 C
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ
Model •OrderΫϥε Item(ྉཧ) ςʔϒϧ൪߸Λϝϯόʹ࣋ͭ •OrderPoolΫϥε Φʔμʔ͕ೖΔͱ૿͑ɺ Φʔμʔ͕ఏڙ͞ΕΔͱݮΔ ΦϜϨπ ×1 εʔϓ
×1 A ΦϜϨπ ×1 εʔϓ ×1 A ΤϏϑϥΠ ×2 ϥΠε ×2 B ϋϜΧπ ×1 ΤϏϑϥΠ ×2 C
class Order { int id; Table tableNum; List<Item> items; Order(this.id,
this.tableNum, this.items); } Model ΦϜϨπ ×1 εʔϓ ×1 A
class OrderPool { int _max = 0; List<Order> _orders =
[]; List<Order> get orders => _orders; void add(Table tableNum, List names) { var items = names.map( (name) => Item(name)).toList(); _orders.add(Order(_max, tableNum, items)); _max += 1; } void remove(...) {...} } Model ΦϜϨπ ×1 εʔϓ ×1 A ΤϏϑϥΠ ×2 ϥΠε ×2 B ϋϜΧπ ×1 ΤϏϑϥΠ ×2 C
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ
ChangeNotifier •͍ͬͯ͏͚ͩͷਓ •Modelʹมߋ͕͋ͬͨ࣌ʹ มߋͨ͠Αͬͯ௨͢Δ •ModelͰextends͞ΕΔ Φʔμʔ͍Γ·ͨ͠ʔʂ ˞ͳ͓ɺMJTUFOFSͷొʙݸ·Ͱ͕ਪ 'MVUUFS4UBUF.BOBHFNFOUXJUI1SPWJEFSc,BSUIJL1POOBNJO'MVUUFS$PNNVOJUZ.FEJVN IUUQTNFEJVNDPNqVUUFSDPNNVOJUZqVUUFSTUBUFNBOBHFNFOUXJUIQSPWJEFSFFCCDBD
class OrderPool extends ChangeNotifier { int _max = 0; List<Order>
_orders = []; List<Order> get orders => _orders; void add(Table tableNum, List names) { var items = names.map( (name) => Item(name)).toList(); _orders.add(Order(_max, tableNum, items)); _max += 1; notifyListeners(); } void remove(...) {...} } ChangeNotifier มߋͨ͠Αͬͯ௨
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ
ChangeNotifierProvider •௨Λಧ͚ͯ൘Λߋ৽͢Δਓ •ModelΛ͏ΫϥεΛwrap͢ΔܗͰઃஔ (৭ΜͳΫϥε͔Βࢀর͞ΕΔ࣌ main.dartͷΑ͏ͳτοϓϨϕϧ) ɹɹ˞ ຊʹඞཁͱͳΔ࣌·ͰϦϏϧυ͠ͳ͍ Φʔμʔ͖ͨΑɺஔ͍ͱ͘Ͷ
class OrderApp extends StatelessWidget { @override Widget build(BuildContext context) {
return ChangeNotifierProvider( builder: (context) => OrderPool(), child: MaterialApp( title: 'OrderManagement', home: OrderBoard(), )); } } ChangeNotifierProvider ͏Ϋϥε(OrderBoard)ͷ্ҐͰએݴ ChangeNotifier͋ Λܧঝͨ͠ ModelΛࢦఆ
MultiProvider •ͨ͘͞Μ͍Δ ChangeNotifierProvider Φʔμʔ͖ͨΑ ͓٬༷͕͖·ͨ͠
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ
•Φʔμʔ൘ •Provider͔Β Λड͚औͬͯදࣔ •ModelΛࢦఆͯ͠͏ Consumer ΦϜϨπ ×1 εʔϓ ×1 A
ΤϏϑϥΠ ×2 ϥΠε ×2 B ϋϜΧπ ×1 ΤϏϑϥΠ ×2 C
class OrderBoard extends StatelessWidget { @override Widget build(BuildContext context) {
return Scaffold( appBar: AppBar(title: Text('OrderBoard')), body: Consumer<OrderPool>(builder: (context, orderList, _) { return ListView(children: [ for (Order order in orderList.orders) ... [OrderCard(order: order)] ]); }), ); } } Consumer ΦϜϨπ ×1 εʔϓ ×1 A ΤϏϑϥΠ ×2 ϥΠε ×2 B ϋϜΧπ ×1 ΤϏϑϥΠ ×2 C
•Model •ChangeNotifier •ChangeNotifierProvider •MultiProvider •Consumer ొਓ → ModelͰmixin → ͏Widget(Ϋϥε)Λwrap
→ දࣔWidget(෦)Λwrap
•Easy & Simple •WidgetπϦʔ͔Βͳ͘ͳΔͱσϑΥϧτͰdispose •ඞཁͳՕॴͷΈϦϏϧυ •Stream͑Δ providerͷ͍͍ͱ͜Ζ
•Ί͚ͩͲͨͿΜΘ͔Γ͍͢BLoCύλʔϯͷղઆ | @kabochapo - Qiita https://qiita.com/kabochapo/items/8738223894fb74f952d3 •FlutterͷBLoC(Business Logic Component)ͷϥΠϑαΠΫϧΛ ਖ਼֬ʹཧͯ͠ఏڙ͢Δbloc_providerύοέʔδͷղઆ
| mono in Flutter ' - Medium https://medium.com/flutter-jp/bloc-provider-70e869b11b2f •[Flutter] package:provider ͷ֤ϓϩόΠμͷৄࡉ | @kabochapo - Qiita https://qiita.com/kabochapo/items/a90d8438243c27e2f6d9 •provider | rrousselGit/provider - GitHub https://github.com/rrousselGit/provider •provider_shopper | filiph/samples - GitHub https://github.com/filiph/samples/tree/provider-shopper/provider_shopper •Pragmatic State Management in Flutter (Google I/O'19) http://youtu.be/d_m5csmrf7I ࢀߟ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠