Firebase - TetsuFe/state_notifier_sample6 GitHub Wiki
https://pub.dev/packages/firebase
firebaseプロジェクトを作成し、以下の変更を加える(apiKeyなどは firebase console の 「プロジェクトを設定」から確認)
main.dart
import 'package:firebase/firebase.dart';
import 'package:flutter/material.dart';
import 'package:flutter_state_management/app.dart';
void main() {
final firebaseApp = initializeApp(
apiKey: "xxxx",
authDomain: "yyyy",
databaseURL: "zzzz",
projectId: "wwww",
storageBucket: "vvvv",
messagingSenderId: "rrrr",
appId: "qqqq",
measurementId: "mmmm");
analytics(firebaseApp);
runApp(RootApp());
}
web/index.html
<body>
<!-- This script installs service_worker.js to provide PWA functionality to
application. For more information, see:
https://developers.google.com/web/fundamentals/primers/service-workers -->
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('flutter_service_worker.js');
});
}
</script>
<script src="https://www.gstatic.com/firebasejs/7.14.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.14.2/firebase-analytics.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.14.2/firebase-firestore.js"></script>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
firebase 7.3.0
firestore https://github.com/FirebaseExtended/firebase-dart/blob/master/example/firestore/index.dart
ドキュメントは古いようだったので、exampleのコードを参考にしました
import 'package:firebase/firebase.dart' as fb;
import 'package:flutter_state_management/story/story.dart';
class StoryApi {
Stream<List<Story>> getStoryList() {
try {
return fb.firestore().collection('stories').onSnapshot.map(
(event) => event.docs.map((e) => Story.fromJson(e.data())).toList());
} on Exception catch (_) {
throw Exception('なんらかのエラーが発生しました');
}
}
}\
リスト取得の際の工夫
Future<List<Sentence>> getStorySentenceList(String storyId) async {
try {
final storySentenceListReference = await fb
.firestore()
.collection('storySentenceLists')
.doc(storyId)
.get();
final storySentenceListDocument = storySentenceListReference.data();
final storySentenceList =
storySentenceListDocument['sentenceList'] as List<dynamic>; // 1段階目のキャスト。一気にはできない
return storySentenceList
.cast<Map<String, dynamic>>() // 2段階目のキャスト。
.map((e) => Sentence.fromJson(e))
.toList();