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
}