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
430
Road to RubyKaigi: Play Hard(ware)
makicamel
1
1k
First step to PicoRuby
makicamel
2
630
PicoRuby on Rails
makicamel
4
310
Take a small step beyond the api
makicamel
2
230
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1.9k
Road to RubyKaigi
makicamel
4
730
Rails アプリ地図考 Flush Cut
makicamel
1
250
ErdMap: Thinking about a map for Rails applications
makicamel
2
4.2k
Other Decks in Programming
See All in Programming
Dockerfile CMD for Node.js
grazie1999
0
110
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
120
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
320
源内ハンズオン概要編
hideg
0
200
今さら聞けない .NET CLI
htkym
0
200
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
360
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
180
AIが無かった頃の素敵な出会いの話
codmoninc
1
480
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
490
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
750
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Side Projects
sachag
455
43k
Optimizing for Happiness
mojombo
378
71k
Designing Experiences People Love
moore
143
24k
The Spectacular Lies of Maps
axbom
PRO
1
940
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
650
Site-Speed That Sticks
csswizardry
13
1.5k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
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 ࢀߟ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠