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

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
2,664 バイト追加 、 2021年10月30日 (土) 02:36
----
[[FlutterFire]]
====pubspec.yaml=====
<pre>
flutter:
sdk: flutter
flutter_riverpod: ^0.14.0+3
firebase_core: ^1.7.0
firebase_auth: ^3.1.3
json_annotation: ^4.0.1
 
dev_dependencies:
flutter_test:
sdk: flutter
json_serializable: ^4.1.3
build_runner: ^2.1.1
</pre>
====Main====
*main.dart
<pre>
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/material.dart';
import 'package:repbuilder/provider/providers.dart';
import 'package:repbuilder/widget/widgets.dart';
import 'package:repbuilder/screen/sign_in/sigin_in.dart';
import 'package:repbuilder/screen/person_list/person_list.dart';
void main() async {
// Firebaseの初期化(非同期)を待つ
await Firebase.initializeApp();
  // ProviderScope でラップ runApp(ProviderScope(child: MyAppRepBuilder()));
}
class MyApp RepBuilder extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MyAppReport Builder',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Consumer( // Comsumeerでラップ builder: (context, watch, child) { final user = watch(userProvider); return Centeruser.when( data: (user) => (childuser == null) ? SignInScreen() : PersonLIst(), loading: () => loadingWidget(), error:Text('MyApp'e, stackTrace)=> errorWidget(context, e, stackTrace), );
},
)
}
}
</pre>
 
====Model====
<pre>
import 'package:json_annotation/json_annotation.dart';
part 'person.g.dart';
 
@JsonSerializable()
class Person {
String? id;
String? name;
DateTime? createdAt;
 
Person({this.id, this.name});
 
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
}</pre>
*json_annotation
<pre>
$ flutter pub run build_runner build
</pre>
 
====Repository====
<pre>
import 'package:firebase_auth/firebase_auth.dart';
import 'package:repbuilder/model/person.dart';
 
class PersonRepository {
final User user;
PersonRepository(this.user);
 
List<Person> getPersonList() {
// DUMMY
return new List.of([new Person(id:"id1",name:this.user.email), new Person(id:"id2",name:this.user.email)]);
}
}
</pre>
 
====Provider====
<pre>
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:repbuilder/repository/repositories.dart';
 
final userProvider = StreamProvider.autoDispose((ref) {
return FirebaseAuth.instance.authStateChanges();
});
 
final personRepositoryProvider = Provider.autoDispose((ref) {
final User? user = ref.watch(userProvider).data?.value;
return user == null ? null : PersonRepository(user);
});
</pre>
 
====Consumer====
<pre>
import 'package:flutter/material.dart';
import 'package:repbuilder/provider/providers.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
 
class PersonLIst extends StatefulWidget {
@override
_PersonLIstState createState() => _PersonLIstState();
}
 
class _PersonLIstState extends State<PersonLIst> {
@override
Widget build(BuildContext context) {
return Consumer(
builder: (context, watch, child) {
final personRep = watch(personRepositoryProvider);
var persons = personRep?.getPersonList();
return Text(persons?.elementAt(0).name ?? 'null');
},
);
}
}
 
</pre>

案内メニュー