Flutter→Firestore接続し、Firestoreから値を取得する

## はじめに
表題通り、Flutter→Firestoreに接続し、値を取得できるようにします。
[前回](https://qiita.com/koji0705/items/4776de9691674b12649b)記事の続きになります。

## Firebaseのプロジェクト立ち上げ
今回の趣旨からずれてしまうため、下記に折りたたんで表示
<details><summary>Firebaseのプロジェクト立ち上げ〜データ保存まで</summary>

プロジェクトの立ち上げ
![スクリーンショット 2024-08-11 9.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/68e76b26-4e56-067f-3d2d-90b9bc321f9a.png)
![スクリーンショット 2024-08-11 9.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/32df92dd-a285-2645-dcb7-25571a13c631.png)
![スクリーンショット 2024-08-11 9.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/ae5f2fda-32eb-2ac4-f0c1-4c36eb92f1d9.png)
![スクリーンショット 2024-08-11 9.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/0378dc08-7373-5839-c3fb-4250e117f330.png)

iosのアプリを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3b165238-91b0-082f-0800-7f6e3846c7d5.png)

![スクリーンショット 2024-08-11 9.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/d31ac23f-d52d-e72b-c40b-b3e37312e29e.png)
![スクリーンショット 2024-08-11 9.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/ade86b83-366d-7e5e-9694-a697eb5388a9.png)
![スクリーンショット 2024-08-11 9.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/31c0bc9d-046a-e7b1-4ad4-915662000c08.png)

![スクリーンショット 2024-08-11 9.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/17b6e000-47b9-48f2-3b64-c994a8e9ec26.png)

cloud firestoreを作成する
![スクリーンショット 2024-08-11 9.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/b420cfdd-8c50-8311-6546-493e1b34550a.png)
![スクリーンショット 2024-08-11 9.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/dc77c8a8-b0c7-a37d-250d-a308fc87181f.png)

![スクリーンショット 2024-08-11 9.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/61af8207-a937-7526-338f-5143e04857cd.png)
![スクリーンショット 2024-08-11 9.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/1aab782e-d558-4892-4957-047dc89fa615.png)
ドキュメントを作成していく。
![スクリーンショット 2024-08-11 9.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/dbbf848c-d8d7-a859-2728-cfa111cd74d6.png)
![スクリーンショット 2024-08-11 9.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3babc96a-efe5-3416-f585-5035939f3bc9.png)

</details>




## ソースコード

```dart:lib/main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'infra/repository/app_database.dart';
import 'screen/map_screen.dart';
import 'package:firebase_core/firebase_core.dart';

import 'services/initialLoad.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  final database = AppDatabase();

  // Firestoreからデータを取得
  List<Map<String, dynamic>> firestoreData = await getFirestoreData();

  // 取得したデータをデータベースに挿入
  await database.insertSeedData(firestoreData);

  runApp(
    Provider(
      create: (_) => database,
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Custom Map Pins',
      home: MapScreen(),
    );
  }
}
```
→ここではFirestoreの値を取得し、ローカルのDBにデータを保存しています。

```dart:lib/services/initialLoad.dart
import 'package:cloud_firestore/cloud_firestore.dart';

Future<List<Map<String, dynamic>>> getFirestoreData() async {
  try {
    // Firestoreのコレクションを指定してデータを取得
    QuerySnapshot querySnapshot = await FirebaseFirestore.instance
        .collection('place') // 'collection_name'を実際のコレクション名に置き換える
        .get();

    // 取得したドキュメントをリストに変換
    List<Map<String, dynamic>> dataList = querySnapshot.docs.map((doc) {
      return doc.data() as Map<String, dynamic>;
    }).toList();
    print('Firestore data: $dataList');

    return dataList;
  } catch (e) {
    print('Error getting data from Firestore: $e');
    return [];
  }
}

Future<List<Map<String, dynamic>>> fetchData() async {
  try {
    List<Map<String, dynamic>> data = await getFirestoreData();

    if (data.isNotEmpty) {
      print('Firestore Data:');
      data.forEach((item) {
        print(item);
      });
    } else {
      print('No data found or error occurred.');
    }

    return data; // 取得したデータを返却
  } catch (e) {
    print('Error fetching data: $e');
    return []; // エラーが発生した場合は空リストを返却
  }
}
```
→ここが今回の趣旨ですね。これでFirestoreからデータが取得できるようになります。