Slide 1

Slide 1 text

4UBUJD&YUFOTJPO.FUIPET
 ࢖͏લʹ஌͓͖͍ͬͯͨ஫ҙॻ͖ 2019.11.7. Flutter Meetup Tokyo #12 @makicamel

Slide 2

Slide 2 text

ࣗݾ঺հ •@makicamel / ઒ݪສق •Flutterྺ൒೥͘Β͍ •Ruby ͱϏʔϧɹɹͱ͓ञ͕޷͖

Slide 3

Slide 3 text

ࣗݾ঺հ

Slide 4

Slide 4 text

•ڥք஋ͱͯ͠ࠓ೔ਂ໷0࣌ͷDateTimeΠϯελϯε͕΄͍͠ DateCalc.now().beginningOfDay(); •aͱb͕ಉ͡೔͔Ͳ͏͔൑ఆ͍ͨ͠ a.isSameDay(b); •c͕Կϲ݄લͳͷ͔Λऔಘ͍ͨ͠ c.differenceValue(type: DateType.month); •1೥ޙͷࠓ೔ͷ೔෇Λग़͍ͨ͠ DateCalc.now().addYear(1); DateCalc

Slide 5

Slide 5 text

Dart 2.6 is available IUUQTEBSUEFW

Slide 6

Slide 6 text

IUUQTUXJUUFSDPNEBSU@MBOHTUBUVT

Slide 7

Slide 7 text

Static Extension Methods %BSU4UBUJD&YUFOTJPO.FUIPET%FTJHOEBSUMBOHMBOHVBHFc(JU)VC
 IUUQTHJUIVCDPNEBSUMBOHMBOHVBHFCMPCFEDDCEBD⒎DD BDDFQUFEGVUVSFSFMFBTFTTUBUJDFYUFOTJPONFUIPETGFBUVSFTQFDJpDBUJPONE

Slide 8

Slide 8 text

Static Extension Methods ? •طଘͷClassΛมߋɾ֦ு(Extend)͢Δߏจ ɹɹɹ֦ுؔ਺ ɹɹɹΤΫεςϯγϣϯ/Extension ɹɹɹΦʔϓϯΫϥε

Slide 9

Slide 9 text

DateFormat('yyyy/MM/dd'). format(DateTime.now().add(Duration(days: 1))); ͜Ε·Ͱ •௕͍ •ͱ͘ʹ3͕ಡΈͮΒ͍ ᶃ ᶄ ᶅ ɹ໌೔ͷ೔෇ͷจࣈྻΛऔಘ͍ͨ͠

Slide 10

Slide 10 text

doMyOtherStuff(doMyStuff(obj.doStuff()).doOtherStuff()); ᶃ ͜Ε·Ͱ ᶄ ᶅ ᶆ ᶅ

Slide 11

Slide 11 text

(DateTime.now() + 1.days).toString('yyyy/MM/dd'); ͜Ε͔Β •γϯϓϧ DateTime.tomorrow().toString('yyyy/MM/dd'); ɹ໌೔ͷ೔෇ͷจࣈྻΛऔಘ͍ͨ͠

Slide 12

Slide 12 text

obj.doStuff().doMyStuff().doOtherStuff().doMyOtherStuff(); ͜Ε͔Β

Slide 13

Slide 13 text

4UBUJD&YUFOTJPO5ZQFTEBSUMBOHMBOHVBHFc(JU)VC
 IUUQTHJUIVCDPNEBSUMBOHMBOHVBHFJTTVFT Static Extension Methods •Readability
 (Մಡੑ) •Discoverability(IDE Support)
 (ൃݟ༰қੑ(IDEͷαδΣετΛड͚΍͍͢)) • Static Extension Types • Pipeline-operator ɹ΋ݕ౼த 1JQFMJOFPQFSBUPSGPSJOMJOFJOWPDBUJPOPGTUBUJDGVODUJPOTEBSUMBOHMBOHVBHFc(JU)VC
 IUUQTHJUIVCDPNEBSUMBOHMBOHVBHFJTTVFT

Slide 14

Slide 14 text

How to try it IUUQTUXJUUFSDPN@NPOPTUBUVT stableҎ֎Ͱ2.6.0Ҏ্ͷਖ਼ࣜ൛͕ೖΓ·ͨ͠

Slide 15

Slide 15 text

1. flutter channel ɹࣗ෼ͷνϟϯωϧΛ֬ೝ 
 3 steps to try it ❯ flutter channel Flutter channels: beta dev master * stable ͠͹Β͘upgrade͍ͯ͠ͳ͍ਓ͸ flutter upgrade ΋ flutter upgrade

Slide 16

Slide 16 text

2. flutter channel master ɹνϟϯωϧ͕stableͳΒ੾Γସ͑ 
 3 steps to try it ❯ flutter channel master Switching to flutter channel 'master'... git: From https://github.com/flutter/flutter git: 55df81e8e..28b5cc382 git: master -> origin/master git: Switched to branch 'master'

Slide 17

Slide 17 text

3. flutter --version ɹμ΢ϯϩʔυͱϏϧυΛ૸ΒͤΔ 
 3 steps to try it ❯ flutter --version Flutter 1.10.15-pre.419 • channel master • https://github.com/flutter/flutter.git Framework • revision 02aac5072c (11 hours ago) • 2019-11-05 14:38:09 -0800 Engine • revision 0928c1af2f Tools • Dart 2.7.0 ४උ׬ྃ

Slide 18

Slide 18 text

Static Extension Methodsͷߏจ extension ExtensionSupporterNum on Num { Duration get days => milliseconds * Duration.millisecondsPerDay; } Ϋϥε໊ ֦ுΫϥε໊͸࣮ࡍ࢖Θͳ͍ͷͰ িಥ͠ʹ໊͍͘લʹ͢Δ

Slide 19

Slide 19 text

extension ExtensionSupporterNum on Num { Duration get days => milliseconds * Duration.millisecondsPerDay; } 1.days

Slide 20

Slide 20 text

1.days 1.days // => 24:00:00.000000

Slide 21

Slide 21 text

ϋϚΓͲ͜Ζ •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •NNBD(Non-Null by Default; null҆શ)
 Ͱͳ͍ม਺ͷnull͸֦ுͰ͖ͳ͍ •ϝιου໊ͷিಥʹ஫ҙ

Slide 22

Slide 22 text

ϋϚΓͲ͜Ζ •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •NNBD(Non-Null by Default; null҆શ)
 Ͱͳ͍ม਺ͷnull͸֦ுͰ͖ͳ͍ •ϝιου໊ͷিಥʹ஫ҙ

Slide 23

Slide 23 text

DateTime() + 1.month •`+` ͷҾ਺ʹΑͬͯݺͿॲཧΛม͍͑ͨ •1.daysͷͱ͖ɿDateTime().addΛݺͼ͍ͨ •1.monthsͷͱ͖ɿDateTime().addMonthΛݺͼ͍ͨ •Duration͸microsecondsͷ֓೦ɺ୯Ґ͸͍࣋ͬͯͳ͍ •ੜ੒࣌ʹdaysͱmonthsͷͲͪΒ͕౉͞Ε͔ͨΘ͔Βͳ͍

Slide 24

Slide 24 text

•DuraionʹtypeΛ࣋ͨͤΕ͹͍͍ͷͰ͸ extension ExtensionSupporterDuration on Duration { DurationType type; } •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •(Ϋϥεม਺͸௥ՃͰ͖Δ) DateTime() + 1.month

Slide 25

Slide 25 text

•ͳͷͰ͜͏ͨ͠ class DurationMonth extends Duration { int months; DurationMonth({this.months = 0}) : super(); } extension ExtensionSupporterNum on num { DurationMonth get months => DurationMonth(months: toInt()); } DateTime() + 1.month

Slide 26

Slide 26 text

•ͳͷͰ͜͏ͨ͠ extension ExtensionSupporterDateTime on DateTime { DateTime operator +(DurationMonth duration) { if (duration.runtimeType == DurationMonth) { return addMonth(duration.months); } return add(duration); } } IUUQTHJUIVCDPNNBLJDBNFMFYUFOTJPO@TVQQPSUFS ͥͻΞυόΠε͍ͩ͘͞ DateTime() + 1.month

Slide 27

Slide 27 text

ϋϚΓͲ͜Ζ •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •NNBD(Non-Null by Default; null҆શ)
 Ͱͳ͍ม਺ͷnull͸֦ுͰ͖ͳ͍ •ϝιου໊ͷিಥʹ஫ҙ

Slide 28

Slide 28 text

NNBD •௕͍ •ಉ͜͡ͱԿճ΋ॻ͖ͨ͘ͳ͍ if (user.containsKey('someList') && user['someList'].isNotEmpty()) { ... }

Slide 29

Slide 29 text

NNBD extension MyNull on Null { bool get isEmpty => true; } null.isEmpty; // => true final user = {'name': 'makicamel'}; user['someList'].isEmpty; // Unhandled exception: // NoSuchMethodError: // The getter 'isEmpty' was called on null.

Slide 30

Slide 30 text

NNBD where a legacy unsafely nullable type may 
 contain null ,
 it is a run-time error if a migrated extension with a 
 non-nullable on type is called on null %BSU4UBUJD&YUFOTJPO.FUIPET%FTJHOEBSUMBOHMBOHVBHFc(JU)VC
 IUUQTHJUIVCDPNEBSUMBOHMBOHVBHFCMPCFEDDCEBD⒎DD BDDFQUFEGVUVSFSFMFBTFTTUBUJDFYUFOTJPONFUIPETGFBUVSFTQFDJpDBUJPONE ैདྷͷnullableͳܕʹnullؚ͕·ΕΔ৔߹ɺ
 nullෆՄͷܕͷExtension͕nullͰݺ͹ΕΔͱ
 ࣮ߦ࣌ΤϥʔʹͳΓ·͢ &YUFOEͰ͖ͳ͍

Slide 31

Slide 31 text

ϋϚΓͲ͜Ζ •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •NNBD(Non-Null by Default; null҆શ)
 Ͱͳ͍ม਺ͷnull͸֦ுͰ͖ͳ͍ •ϝιου໊ͷিಥʹ஫ҙ

Slide 32

Slide 32 text

ϝιου໊ͷিಥ extension ListT on List { void best() => print('bestT'); } extension ListInt on List { void best() => print('bestInt'); } ίϯύΠϧΤϥʔʹͳΒͳ͍
 ʢͪͳΈʹ'bestT'͕ฦͬͯ͘Δ)

Slide 33

Slide 33 text

ϝιου໊ͷিಥ extension ListT on List { void best() => print('bestT'); } extension ListNum on List { void best() => print('bestNum'); } // => Error: The method 'best' isn't defined // for the class 'List'. ৄࡉ౓͕ಉ͡Extension͕ఆٛ͞Ε͍ͯΔͱ
 ίϯύΠϧΤϥʔʹͳΔ

Slide 34

Slide 34 text

ϝιου໊ͷিಥ [1].best(); extension ListInt on List { void best() => print('bestInt'); } extension ListT on List { void best() => print('bestT'); } extension ListNum on List { void best() => print('bestNum'); } extension ListNone on List { void best() => print('bestNone'); } ͨ͠৔߹ɺ্͕ڧ͍ˡˠԼ͕ऑ͍

Slide 35

Slide 35 text

•ৄࡉ౓Λߟ͑࢝ΊΔઃܭ͸Կ͔͕ؒҧ͍ͬͯΔ ϝιου໊ͷিಥ

Slide 36

Slide 36 text

ͭ·Γ

Slide 37

Slide 37 text

•૝ఆͨ͠ڍಈͱҧ͏ڍಈΛ͢ΔՄೳੑ͕͋Δ •ؒ઀తʹ֦ு͞Ε͍ͯΔͱมߋʹؾ͖ͮʹ͍͘ •໊લ͕িಥͨ࣌͠ʹยํ͕༏ઌ౓ͷ໰୊Ͱෛ͚Δ •໊લ͕িಥͨ࣌͠ʹ༏ઌ౓͕ಉ͡ͰΤϥʔʹͳΔ •ؒ઀తʹ֦ு͞Ε͍ͯΔͱিಥʹؾ͖ͮʹ͍͘ •ϥΠϒϥϦಉ࢜Ͱ֦ு͕িಥ͢Δͱղܾ͕ࠔ೉ •☝Λௐ੔͠Α͏ͱͯ͠ͳίʔυ͕ੜ·Ε΍͍͢ Ϋϥεͷڍಈͷมߋ͸ةݥ

Slide 38

Slide 38 text

•ΞϓϦέʔγϣϯίʔυͰͷར༻͸ϧʔϧܾΊ͕େࣄ •extensionsσΟϨΫτϦΛ੾ִͬͯ཭ •ϑΝΠϧΛࡉ͔͘෼͚ͯখ͘͞importͰ͖ΔΑ͏ʹ͢Δ •APIΛ૿΍͢৔߹͸νʔϜ಺Ͱ໋໊نଇΛઃఆ •( ͔ͿΓͦ͏ͳ໊લ͸࣌ݶര஄ ) •ϥΠϒϥϦͷόάͳͲҰ࣌తͳύονͷ৔߹͸APIΛมߋ ͠ͳ͍ •ͦ΋ͦ΋ແҋʹߦ͏΋ͷͰ͸ͳ͍ Ϋϥ εͷڍಈͷมߋ͸ةݥʁ

Slide 39

Slide 39 text

ϥΠϒϥϦ࡞੒࣌ͷํ਑ •֦ுͨ͠ϝιουΛAPIͱͯ͠ఏڙ͠ͳ͍৔߹ •ϝιου໊ͷϓϨϑΟοΫεΛύοέʔδ໊ʹ͢ΔͳͲ ͷϧʔϧ͕͋Δͱ҆৺ͦ͏ •֦ுͨ͠APIΛఏڙ͢Δ৔߹ DateTime.now() + 1.months; •ϝιου໊ࣗମʹҙຯ͕͋Δ •ϑΝΠϧΛࡉ͔͘෼Θ͚Δ͘Β͍ͷରࡦ͔ͱ…

Slide 40

Slide 40 text

•஫ҙ఺ •Πϯελϯεม਺͸௥ՃͰ͖ͳ͍ •null҆શͰͳ͍ม਺ͷnull͸֦ுͰ͖ͳ͍ •ϝιου໊ͷিಥʹ஫ҙ •Static Extension Methods͸͍͍ͧ •௒؆୯ʹ࢝ΊΒΕΔ •ඪ४Ϋϥεʹϝιου௥ՃͰ͖Δͷָ͍͠ʂ ·ͱΊ

Slide 41

Slide 41 text

༻๏ɾ༻ྔΛकͬͯ ͝ར༻͸ܭըతʹ ͨͩ͠

Slide 42

Slide 42 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠