| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Flutter Riverpod

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

| Flutter | Dart | ブログカテゴリ(Flutter) | Android Studio | Flutter macos | FlutterFire | Flutter 手順 |

Flutter Riverpod

基本

データの受け渡し


Providerをグローバルに定義し、データを受け渡す

データを渡す


種類 目的
Provider 任意のデータを渡す
FutureProvider Futureから取得する任意のデータを渡す
Stream Provider Streamから取得する任意のデータを渡す
StateProvider 変更可能な任意のデータを渡す
StateNotifireProvider StateNotifireProviderから取得する任意のデータを渡す
ScopedProvider 場所に応じて異なる任意のデータを渡す

データを受け取る


種類 目的
ConsumerWidget 継承することでデータを受け取れるWidget
Consumer コールバック内でデータを受け取れるWidget
useProvider() flutter_hooksを利用し、HookWidgetを継承したWidgetでデータを受け取れる関数
context.read() BuildContextからデータを受け取れる関数(ただしデータの変更通知は受け取れない)
ProviderContainer Flutterに依存しない形でデータを受け取れる

基本


FlutterFire

pubspec.yaml=

  1. flutter:
  2. sdk: flutter
  3. flutter_riverpod: ^0.14.0+3
  4. firebase_core: ^1.7.0
  5. firebase_auth: ^3.1.3
  6. json_annotation: ^4.0.1
  7.  
  8. dev_dependencies:
  9. flutter_test:
  10. sdk: flutter
  11. json_serializable: ^4.1.3
  12. build_runner: ^2.1.1

Main

  • main.dart
  1. import 'package:firebase_core/firebase_core.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:repbuilder/provider/providers.dart';
  5. import 'package:repbuilder/widget/widgets.dart';
  6. import 'package:repbuilder/screen/sign_in/sigin_in.dart';
  7. import 'package:repbuilder/screen/person_list/person_list.dart';
  8.  
  9. void main() async {
  10. // Flutter の初期化処理を待つ
  11. WidgetsFlutterBinding.ensureInitialized();
  12. // Firebaseの初期化(非同期)を待つ
  13. await Firebase.initializeApp();
  14. runApp(ProviderScope(child: RepBuilder()));
  15. }
  16.  
  17. class RepBuilder extends StatelessWidget {
  18. // This widget is the root of your application.
  19. @override
  20. Widget build(BuildContext context) {
  21. return MaterialApp(
  22. title: 'Report Builder',
  23. theme: ThemeData(
  24. primarySwatch: Colors.blue,
  25. ),
  26. home: Consumer(
  27. builder: (context, watch, child) {
  28. final user = watch(userProvider);
  29. return user.when(
  30. data: (user) => (user == null) ? SignInScreen() : PersonLIst(),
  31. loading: () => loadingWidget(),
  32. error: (e, stackTrace) => errorWidget(context, e, stackTrace),
  33. );
  34. },
  35. )
  36. );
  37. }
  38. }

Model

  1. import 'package:json_annotation/json_annotation.dart';
  2. part 'person.g.dart';
  3.  
  4. @JsonSerializable()
  5. class Person {
  6. String? id;
  7. String? name;
  8. DateTime? createdAt;
  9.  
  10. Person({this.id, this.name});
  11.  
  12. factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  13. Map<String, dynamic> toJson() => _$PersonToJson(this);
  14. }
  • json_annotation
  1. $ flutter pub run build_runner build

Repository

  1. import 'package:firebase_auth/firebase_auth.dart';
  2. import 'package:repbuilder/model/person.dart';
  3.  
  4. class PersonRepository {
  5. final User user;
  6. PersonRepository(this.user);
  7.  
  8. List<Person> getPersonList() {
  9. // DUMMY
  10. return new List.of([new Person(id:"id1",name:this.user.email), new Person(id:"id2",name:this.user.email)]);
  11. }
  12. }

Provider

  1. import 'package:firebase_auth/firebase_auth.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:repbuilder/repository/repositories.dart';
  4.  
  5. final userProvider = StreamProvider.autoDispose((ref) {
  6. return FirebaseAuth.instance.authStateChanges();
  7. });
  8.  
  9. final personRepositoryProvider = Provider.autoDispose((ref) {
  10. final User? user = ref.watch(userProvider).data?.value;
  11. return user == null ? null : PersonRepository(user);
  12. });

Consumer

  1. import 'package:flutter/material.dart';
  2. import 'package:repbuilder/provider/providers.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4.  
  5. class PersonListPage extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return Scaffold(
  9. appBar: AppBar(
  10. title: Text('TODO APP TITLE'),
  11. ),
  12. body: _PersonListView()
  13. );
  14. }
  15. }
  16. class _PersonListViewState extends ConsumerWidget {
  17. @override
  18. Widget build(BuildContext context, ScopedReader watch) {
  19. final personRep = watch(personRepositoryProvider);
  20. var persons = personRep?.getPersonList();
  21. return buildDataTable(persons!);
  22. }
  23. Widget buildDataTable(List<Person> persons) {
  24. :
  25. }
  26. }