首页 > 解决方案 > 如何根据firestore值返回布尔值

问题描述

我在 Firestore 中有一个布尔值,我需要根据这个布尔值设置一个条件。我试图从firestore中获取这个布尔值,然后在我的futurebuilder中使用它,但即使我可以看到firestore中有值,我总是会得到null。请帮忙。

 Future<bool> getUser() async {
 dynamic data;
 bool isUser=false;

final DocumentReference document =   
 FirebaseFirestore.instance.collection('users').doc(uida).collection('pre').doc();

isUser = await document.get().then<dynamic>(( DocumentSnapshot snapshot) async{
  data =snapshot.data;
  final data1 = data.map((doc) => doc['enrolled']);
  print(data1.toString());
  if (data1==true){
   setState(() {
     isUser = true;
    });}
  });

return isUser;
 }

小部件

    return FutureBuilder(
    future: getUser(),
    builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
   
      if (snapshot.data == true)
     
        return Text(snapshot.data.toString());

标签: fluttergoogle-cloud-firestore

解决方案


使用异步代码时,最好使用 async 和 await 或使用 then。在您的情况下, async 和 await 将提供更具可读性的代码。

对于您的 getUser 函数,这将类似于:

 Future<bool> getUser() async {
 dynamic data;
 bool isUser=false;

 final DocumentReference document =   
  FirebaseFirestore.instance.collection('users').doc(uida).collection('pre').doc();

isUser = await document.get()
data = snapshot.data;
final data1 = data['enrolled'];
print(data1.toString());
if (data1==true){
   setState(() {
     isUser = true;
    });}
  });

return data1;
}

对于 Futurebuilder,最好检查快照是否包含数据,使用如下所示的 snapshot.hasData:

return FutureBuilder(
future: getUser(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {

  if (snapshot.hasData)
    if (snapshot.data ==true){
 
       return Text(snapshot.data.toString());
    } else {
       return Text('still waiting for data...')

有关更好的解释,请参阅https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html 。


推荐阅读