安裝Package

在Flutter操作Firestore之前,要先安裝名為cloud_firestore的Package

  1. 前往pub.dev中的cloud_firestore頁面(連結)

  2. 點擊Installing頁面,可以看到目前cloud_firestore的最新版本

  3. 打開你Flutter專案中的pubspec.yaml,找到dependencies,並在其下方加上cloud_firestore : [你看到的最新版本]

  4. 此時你的VScode應該會自動安裝此Package,但如果沒有的話,可以在Terminal中執行以下指令 :

    1
    $ flutter pub get

Class建立 - Comment物件

如果要在Flutter專案中傳遞評論的資料,我建議可以新增一個名為Comment的Object,這樣在傳遞時可以將所有資訊打包在一起,而不需要一個一個傳遞!

  • 新增Comment class :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Comment{

    // 要儲存的資訊
    String username;
    String userID;
    String commentID;
    String time;
    String title;

    //Comment結構式
    Comment({this.commentID, this.time, this.title, this.userID, this.username});

    }

Class建立 - DataService物件

接下來,我們來建立跟Firestore互動的Class吧!

  • 引入Package :

    1
    2
    3
    4
    5
    //引入Comment Class
    import 'package:[你的專案名稱]/.../Comment.dart';

    //引入事前安裝好的Cloud Firestore Package
    import 'package:cloud_firestore/cloud_firestore.dart';
  • 新增DataService class :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class DataService{

    //會使用到的資訊
    String userID;
    String commentID;

    //DataService結構式
    DataService({this.userID, this.commentID});

    //之後讀寫函式都能放在這裡~
    }

Cloud Firestore初始化

  • 開啟你的main.dart,並引入Cloud Firestore Package :

    1
    import 'package:cloud_firestore/cloud_firestore.dart';
  • 接著在main function中加入以下程式碼 :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void main() async{

    //WidgetsFlutterBinding初始化,請見下方說明
    WidgetsFlutterBinding.ensureInitialized();

    //Firebase初始化
    await Firebase.initializeApp();

    //執行App內容
    runApp(MyApp());
    }
  • WidgetsFlutterBinding初始化 :

    • 以下是Flutter的架構圖 :

    • 而在Flutter中,Firebase此套件必須依靠這些模組與功能來完成初始化,但在進行Firebase存取時,這些操作通常是非同步的(asynchronous)。
    • 因此我們必須確認名為WidgetsBinding的物件已經被初始化,以下為初始化的方式 :
      1
      WidgetsFlutterBinding.ensureInitialized();
      • 以下是WidgetsBinding的結構圖 :

      • 可以看到,WidgetsBinding結合到許多其他Class,而在初始化時,這些Class將會被依序執行
      • 欲了解更多有關WidgetsBinding的資訊,可以去瀏覽ad6623的文章
  • Firebase初始化 :

    • 接著,就可以初始化Firebase了 :
      1
      await Firebase.initializeApp();
    • 這裡很重要的一點,就是此初始化必須要加上await。因為初始化是非同步的,必須等到套件完全被初始化,才能繼續後面的動作!

      也就是為何在程式碼中,main後面要加上async的原因


總結

  • 我們目前已經把Flutter所需的事前準備都設定好了,下次就要開始練習讀取資料瞜!

引用與參考資料

  1. ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
  2. 深入理解Flutter应用启动
  3. Flutter框架分析(二)– 初始化