0
1

More than 1 year has passed since last update.

FireStoreの値を取得する

Last updated at Posted at 2022-04-03

FireStoreの学習をやってみた。

参考にしたサイト
日本語の記事(こちらを参考にした)
https://flutternyumon.com/firestore-get-realtime-data/
公式ドキュメント
StreamBuilderについて書かれた公式ドキュメント
https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html

開発環境

  • macOS Monterey
  • flutter2.10.3

やろうと思った理由
Firebaseとの接続をするときの知識が、まだ足りていないので、StatefulWidgetで先ずやってみようと思った。
コピペだけだと勉強にならないので、コードを書き換えたりFirebaseのフィールドを追加してみた。

main.dart

//ソース
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  //ステップ1
  final _firestore = FirebaseFirestore.instance;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Chat')),
        body: SafeArea(
          //ステップ2
          child: StreamBuilder(
            stream: _firestore.collection('messages').snapshots(),
            builder:
                (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
              if (snapshot.hasError) {
                return const Center(
                  child: Text('取得できませんでした'),
                );
              }

              if (!snapshot.hasData) {
                return const Center(
                  child: Text("Loading"),
                );
              }

              return ListView(
                children: snapshot.data!.docs.map((DocumentSnapshot document) {
                  Map<String, dynamic> message =
                      document.data()! as Map<String, dynamic>;
                  return Card(
                    color: Colors.grey[100],
                    child: ListTile(
                      title: Text(
                        document['text'],
                        style: const TextStyle(
                            fontSize: 20,
                            fontWeight: FontWeight.bold,
                            color: Colors.black87),
                      ),
                      subtitle: Text(document['subtext']),
                    ),
                  );
                }).toList(),
              );
            },
          ),
        ),
      ),
    );
  }
}

スクリーンショット 2022-04-03 15.19.36.png

Cloud Firestore データモデル
文字の書き方が理解できた気がする🤔

messages:
  text: ""
  subtext: ""

公式のドキュメント
https://firebase.google.com/docs/firestore/data-model?hl=ja#documents

ドキュメント内の複雑なネストされたオブジェクトはマップと呼ばれるらしい?
ドキュメントは JSON によく似ており、実際基本的には JSON と同じです。
一般的にドキュメントは軽量の JSON レコードとして扱うことができます。
RDBと構造が違うから、慣れるまでは難しそう...

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1