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
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
390
Road to RubyKaigi: Play Hard(ware)
makicamel
1
700
First step to PicoRuby
makicamel
2
570
PicoRuby on Rails
makicamel
4
290
Take a small step beyond the api
makicamel
2
210
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1.8k
Road to RubyKaigi
makicamel
4
710
Rails アプリ地図考 Flush Cut
makicamel
1
230
ErdMap: Thinking about a map for Rails applications
makicamel
2
4.2k
Other Decks in Programming
See All in Programming
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
790
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
Inside Stream API
skrb
1
800
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
8.4k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.4k
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
110
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.4k
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
320
どこまでゆるくて許されるのか
tk3fftk
0
260
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
Featured
See All Featured
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
First, design no harm
axbom
PRO
2
1.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
KATA
mclloyd
PRO
35
15k
Designing for Performance
lara
611
70k
How STYLIGHT went responsive
nonsquared
100
6.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
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 ࢀߟ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠