Open4

FlutterでFirebase上のDataをあれこれする

さくさく

以下のようなfirebaseの構成を想定。

Documentフィールドの情報にアクセスする

ここまでは共通。

final DocumentSnapshot docSnapshot = await FirebaseFirestore.instance.collection('Collection1').doc('Document1').get();

1. Document内の全てのフィールドを確認する場合

今のとこ2通り

Object? Function() functionData = docSnapshot.data; // Function():引数に関数を変数として渡す
print(functionData()); // functionDataは関数
print(docSnapshot.data());

コンソールに以下のように表示されるはず

flutter: {field1: a, field2: 1, position}

2. Document内の特定のフィールドのみ参照する場合

String fieldData = docSnapshot.get("Field1");
print(fieldData);

コンソールに以下のように表示されるはず

flutter: a
さくさく

Future型として受け取った値をFutureでない変数に代入する

Future<int> function1(){
    int returnData;
    // 略
    return returnData;
}

void function2(){
    int subData;
    function1().then((result){
        subData(result); // function1の処理を待ってintとして受け取れるようになったら結果をsubDataに代入
    });
    // subData = function1(); は、両辺の方が違うのでError(int ≠ Future<int>)
}
さくさく

【原因調査中】
awaitの結果を待ってreturnしたいができない

Future<List> function() async {
    List<int> list = [];
    final basecollection = FirebaseFirestore.instance.collection()...[中略].get(); 

    await baseCollection.then(
        (QuerySnapshot querySnapshot) => {
            querySnapshot.docs.forEach( // 5回繰り返しがあると仮定
                (doc)  {
                    print("1");
                    operateFirebase().then((result) { // operateFirebase():docをもとに、firebase内の別のCollectionから情報を取得する関数
                        list.add(result);
                        print("2");
                    } );
                    print("3");
                },
            ),
        },
    );
    print("done");
    return
}

こうなる

flutter: 1
flutter: 3
flutter: 1
flutter: 3
flutter: 1
flutter: 3
flutter: 1
flutter: 3
flutter: 1
flutter: 3
flutter: done
flutter: 2
flutter: 2
flutter: 2
flutter: 2
flutter: 2

こうしたい

flutter: 1
flutter: 2
flutter: 3
flutter: 1
flutter: 2
flutter: 3
flutter: 1
flutter: 2
flutter: 3
flutter: 1
flutter: 2
flutter: 3
flutter: 1
flutter: 2
flutter: 3
flutter: done
さくさく

解決。
async/awaitをネストさせる。

Future<List> function() async {
    List<int> list = [];
    await FirebaseFirestore.instance.collection()...[中略].get().
    .then((QuerySnapshot querySnapshot) async { // こっちも非同期処理にする!
            for (var doc in querySnapshot.docs) { // foreachが推奨されていないようなのでforに置き換え
                await operateFirebase().then((result) {
                    list.add(result);
                } );
            },
        });
    return
}