Slide 1

Slide 1 text

2020/08/21 ͸Μ·ʔ @ Flutter Riverpodͷ͢ʍΊ @Yumemi.apk #1 Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.

Slide 2

Slide 2 text

͸Μ·ʔ • AndroidΤϯδχΞ • 2019೥8݄גࣜձࣾΏΊΈத్ೖࣾ • ݩϝΠϯϑϨʔϜΤϯδχΞ • 6݄ʹ௕ঁ஀ੜ • Twitter : @watashi_desu_82 • Qiita : @hammer0802 ࣗݾ঺հ ↑ࢲͷ෼਎
 ϋϯϚϩΠυ͘Μ 2

Slide 3

Slide 3 text

1. RiverpodΛ஌Δ্Ͱͷલఏ஌ࣝ 2. Riverpodͱ͸ʁProviderͱൺֱͨ͠ར఺ ࠓ೔࿩͢͜ͱ 3

Slide 4

Slide 4 text

ࠓ೔ͷΰʔϧʢͱݸਓతئ๬ʣ 1. Riverpodͷར఺͕ͬ͘͟ΓΘ͔Δ 2. Provider→RiverpodҠߦͷ͖͔͚ͬʹͳΔ 3. Riverpodɺͻ͍ͯ͸FlutterʹڵຯΛ࣋ͬͯ΋Β͏ʢFlutter஥ؒΛ૿ ΍͢ʣ 4

Slide 5

Slide 5 text

લఏ஌ࣝ 5

Slide 6

Slide 6 text

Flutterɹɹͱ͸ʁ • ϚϧνϓϥοτϑΥʔϜϑϨʔϜϫʔΫʢAndroid / iOS / Web / Desktopʣ • Google੡ • એݴతUIɹ͜͏͍͏ͷˠ • ݴޠ͸Dart • JITʢJust In TimeʣͱAOTʢAhead Of Timeʣ྆ํͷίϯύΠϥΛαϙʔτ
 →Hot Reload͕ศར Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC. 6

Slide 7

Slide 7 text

એݴతUIͰ͋Γ͕ͪͳঢ়ଶ؅ཧ໰୊ Parent Level 1 Level 2 Level 3 Data Prop Drilling ͜͜Ͱࢀর͍ͨ͠ όέπϦϨʔͷΑ͏ʹ σʔλΛड͚౉ͯ͠͠ ͠·͏ʢLevel 1, 2Ͱ ඞཁͳ͍ͷʹʣ 7

Slide 8

Slide 8 text

໰୊ղܾͷͨΊͷ༷ʑͳΞʔΩςΫνϟ BLoC Redux Provider Provide setState MobX Scoped Model 8

Slide 9

Slide 9 text

BLoC Redux Provider Provide setState MobX Scoped Model Providerਪ঑͠·͢ 9

Slide 10

Slide 10 text

Provider ʮͱΓ͋͑ͣProvider࢖͓͏ʯͷಓے͕Ͱ͖ͨ ※͋͘·Ͱਪ঑Ͱ͋Γɺۜͷ஄ؙͰ͸ͳ͍ 10

Slide 11

Slide 11 text

Providerͱ͸ʁ • ঢ়ଶ؅ཧ͓ΑͼDIͷ࢓૊ΈΛఏڙ͢ΔϥΠϒϥϦ • Widget΁DI͢Δ͜ͱ͕Ͱ͖ɺҾ਺Ͱ஋Λ౉͢ඞཁͳ͠
 →Prop Drillingճආ • ChangeNotifier΍StateNotifierΛ࢖ͬͯWidgetʹ஋Λ௨஌͠ɺUIߋ৽
 →ঢ়ଶͱϩδοΫΛWidget͔Β෼཭ • ஋Λࢀর͍ͯ͠ΔWidget͚͕ͩϦϏϧυ
 →ύϑΥʔϚϯε޲্ Foo( child: Consumer( builder: (_, a, child) { return Bar(a: a, child: child); }, child: Baz(), ), ) a͕ߋ৽͞ΕͨΒ
 Bar͚ͩϦϏϧυ 11

Slide 12

Slide 12 text

Flutterք۾ʹฏԺ͕๚Εͨ…͔ʹݟ͑ͨ 12

Slide 13

Slide 13 text

৽ͨͳࢗ٬ɺRiverpod • ࠓ೥6݄stable൛ϦϦʔεʢ20/08/21࣌఺ : v0.6.1ʣ • Providerͱಉ͡࡞ऀ • ProviderΛҰ͔Β࠶ߏஙͨ͠৽͍͠Provider • Flutter༻ɺflutter_hooks༻ɺඇFlutter༻ͷ3छྨ ProviderΑΓԿ͕ྑ͘ͳͬͨͷ͔ʁ 13

Slide 14

Slide 14 text

Riverpodͷར఺ (Ұ෦) 14

Slide 15

Slide 15 text

Flutter͡Όͳͯ͘΋࢖͑Δ • BuildContextʹґଘ
 →FlutterͰ͔͠࢖͑ͳ͍ • ࠶ߏஙͨ͜͠ͱͰBuildContext͔Β୤ґଘ
 →Pure DartͰ΋࢖͑ΔΑ͏ʹͳͬͨʂ Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.
 Dart and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC. 15

Slide 16

Slide 16 text

άϩʔόϧม਺ͰProviderΛએݴͰ͖Δ main.dart void main() { runApp( StateNotifierProvider( create: (_) => HogeNotifer(), child: MyApp(), ); } • ΞϓϦͷϧʔτͰએݴ
 →ProviderΛฤू͢Δͨͼʹ main.dartΛߦ͖དྷ… • ProviderScope഑ԼͳΒͲ͜Ͱ΋એݴՄೳ
 →WidgetͱProviderΛ1ϑΝΠϧʹू໿Ͱ͖Δ main.dart void main() { runApp( ProviderScope( child: MyApp(), ), ); } app.dart final hogeProvider = StateNotifierProvider((ref) => HogeNotifier() ); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Consumer( (context, read) { final hoge = read(hogeProvider); return Text(hoge); }, ), ), ); } } 16

Slide 17

Slide 17 text

ಉ͡ܕͷProviderΛෳ਺࣋ͯΔ • ʮWidget πϦʔΛ͔͞ͷ΅ͬͯ࠷دΓ ͷ Provider Λऔಘ͠ɺͦͷ஋Λฦ ͢ʯ࢓༷ͷͨΊɺಉ͡ܕͷProviderΛ ෳ਺࣋ͯͳ͍ MultiProvider( providers: [ Provider.value(value: ‘Mona’), Provider.value(value: ‘Lisa’), ], child: HogeWidget(context), ) Widget HogeWidget(BuildContext context) { final firstName = Provider.of(context); final lastName = Provider.of(context); print(firstName); // Lisa͕දࣔ͞ΕΔ print(lastName); // Lisa͕දࣔ͞ΕΔ } • ಉ͡ܕͰ΋ෳ਺ͷProviderΛಠཱͯ͠ ࣋ͭ͜ͱ͕Ͱ͖Δ final firstNameProvider = Provider((ref) => ‘Mona'); final lastNameProvider = Provider((ref) => ‘Lisa’); : : Consumer( (context, read) { final firstName = read(firstNameProvider); final lastName = read(lastNameProvider); print(firstName); // Mona͕දࣔ͞ΕΔ print(lastName); // Lisa͕දࣔ͞ΕΔ } 17

Slide 18

Slide 18 text

ঢ়ଶͷܭࢉ݁ՌΛProviderͱͯ࣋ͯ͠Δ • Provider͔ΒผͷProviderͷঢ়ଶΛಡΈࠐΈɺͦΕΛܭࢉͨ݁͠ՌΛProvider ͱͯ࣋ͭ͜͠ͱ͕Ͱ͖Δ • watch͍ͯ͠ΔProviderͷঢ়ଶ͕มߋ͞Εͯ΋ɺܭࢉ݁Ռͷঢ়ଶ͕มΘΒͳ͍ ৔߹͸ࢀর͍ͯ͠ΔWidget͕ϦϏϧυ͞Εͳ͍ • ϑΟϧλʔ΍ιʔτͳͲͷػೳͰ࢖͏ͱύϑΥʔϚϯε࠷దԽ͕Ͱ͖Δ final firstNameProvider = StateProvider((ref) => ‘Mona'); final lastNameProvider = StateProvider((ref) => ‘Lisa’); final initialsProvider = Provider((ref) { final firstName = ref.watch(firstNameProvider).state; final lastName = ref.watch(lastNameProvider).state; return '${firstName[0]}${lastName[0]}'; }); home: Scaffold( body: Center( child: Consumer( (context, read) { final initials = read(initialsProvider); return Text(initials); // ML͕දࣔ͞ΕΔ }, ), ), 18

Slide 19

Slide 19 text

֎෦ύϥϝʔλ͔ΒProviderΛ࡞੒Ͱ͖Δ • Ҿ਺ʹ஋Λ෇༩ͯ͠providerʹ౉͢͜ͱ͕Ͱ͖Δ • ࢖༻͢Δʹ͸ .family Λ࢖͏ // userIdΛ౉͠ɺUserRepository.fetch()Λ࢖ͬͯඇಉظͰϢʔβʔ৘ใΛऔಘ͢ΔͱԾఆ final userProvider = FutureProvider.family((ref, userId) async { final userRepository = ref.read(userRepositoryProvider); return await userRepository.fetch(userId); }); 19

Slide 20

Slide 20 text

ෆཁͳProviderΛࣗಈͰഁغͰ͖Δ • લϖʔδͷίʔυͩͱɺUserΛऔಘ͢ΔͨͼUserͷProvider͕૿͍͑ͯͬͯ͠ ·͏ • ෆཁʹͳͬͨΒࣗಈతʹഁغͰ͖ΔΦϓγϣϯ͕͋Δʢ.autoDisposeʣ • .familyͱ.autoDispose͸ಉ࣌ʹ࢖͑Δ final userProvider = FutureProvider.family.autoDispose((ref, userId) async { final userRepository = ref.read(userRepositoryProvider); return await userRepository.fetch(userId); }); 20

Slide 21

Slide 21 text

͜ΕҎ֎ʹ΋Riverpodͷར఺͸ͨ͘͞Μ 21

Slide 22

Slide 22 text

Α͠ɺૣ଎Provider͔Β৐Γ׵͑Δͧʂ 22

Slide 23

Slide 23 text

஫ҙɿഁյతมߋ͕·ͩଟ͍ ྫ͑͹ɺv0.6.0ͩͱ͜Ε͚ͩมߋʢbreaking changeؚΉʣ͋Γ ʢݸਓతʹ͸ʣ͜ΕΛߟྀͯ͠΋৐Γ׵͑Λݕ౼͢Δͷ͸͋Γ 23

Slide 24

Slide 24 text

·ͱΊ 24

Slide 25

Slide 25 text

Riverpodɺࢼ͠ʹ࢖ͬͯΈΔͷ͸ ͍͔͕Ͱ͠ΐ͏͔ʁ • Riverpod͸Flutterঢ়ଶ؅ཧͷςούϯͰ͋ΔProviderΛ͞ΒʹਐԽͤͨ͞΋ͷ • Provider͕ಧ͍͍ͯͳ͔ͬͨᙱ͍ͱ͜Ζʹख͕ಧ͍͍ͯΔ • ·ͩ·ͩഁյతมߋ༗Γ͕ͩɺProvider͔ΒͷҠߦΛݕ౼ͯ͠΋ྑͦ͞͏ 25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

ࢀߟURL • RiverpodެࣜϖʔδLink • flutter_riverpod library • [Flutter] package:provider ͷ֤ϓϩόΠμͷৄࡉ • [Flutter]RiverpodΛ࢖ͬͯToDoΞϓϦΛ࡞ͬͯΈͨ (ࣗஶ) 27