Flutter Future<QuerySnapshot> 为空

Flutter Future<QuerySnapshot> empty

大家好,感谢大家抽出宝贵时间。 作为这里的新成员,我恳请不要对我和我的担忧太苛刻,如果我违反了我此刻不知道的任何规则。

情况:我得到了 flutter 代码来增强功能。预先存在的代码正在从 firestore 数据库中获取数据。我被要求增强代码以添加用户管理(管理功能)。所有参与人员都是flutter新手所以所有代码基本上都是根据网上的例子完成的。

问题: 到目前为止还好,但是只要我在查询快照上调用未来函数,我就不会得到任何用户数据。我尝试了不同的方法,但 none 确实有效(例如,通过 for 循环遍历快照、添加 Firestore 索引器、添加规则等)

在下文中,我将向您介绍 firestore 结构以及检索数据并发送到列表视图构建器的最新尝试:

FireStore

这是代码:

final _auth = FirebaseAuth.instance;
CollectionReference _collectionRef =
    FirebaseFirestore.instance.collection('users');

class _UserlistScreenState extends State<UserlistScreen> {
  final currentUser = _auth.currentUser.email;

  @override
  void initState() {
    getUserList();
    print(traceCount++);
    super.initState();
  }

  var traceCount = 0;
  var snapshotData;
  var itemCount;
  var userList;

  Future<QuerySnapshot> getUserList() async {
    return userList = await _collectionRef
        .doc('settings')
        .collection('userSettings')
        //.where('cid', isEqualTo: globals.CID)
        .get();
  }

  /*Function Cycle() {
    for (var doc in userList.docs) {
      print(doc.data);
    }
  }*/

  


  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Hero(
            tag: 'logo',
            child: Image.asset(
              'assets/rgb.png',
              height: MediaQuery.of(context).size.height * 0.05,
              fit: BoxFit.cover,
            ),
          ),
          actions: [],
          centerTitle: true,
          elevation: 4,
        ),
        body: BackgroundContainer(
          child: Column(
            children: [
              Expanded(
                child: FutureBuilder(
                    future: getUserList(),
                    builder:
                        (BuildContext context, AsyncSnapshot querySnapshot) {
                      
                      if (querySnapshot.hasData) {
                      
                      print(userList.docs); // test
                         /*return ListView(children: getUser(querySnapshot));*/ // also test
                        
                        return ListView.builder(
                          itemCount: userList.docs.length,
                          itemBuilder: (BuildContext context, index) {
                            var xname = userList.docs[index]['name'].toString();
                            var xemail = userList.docs[index]['email'].toString();
                            
                            final List<Map> _tableData = [
                              {'id': 'Name:', 'content': xname},
                              {'id': 'Email:', 'content': xemail},
                            ];

                            return ListTile(
                              enabled: true,
                              selected: false,
                              tileColor: Colors.black,
                              leading: Icon(Icons.person),
                              title: Text('Name'),
                              subtitle: Text('Email'),
                              
                              /*title: Text("Name: " +
                                  //    userList.data.docs[index].get('name')),
                                  userList.data.docs[index]['name'].toString()),
                              subtitle: Text("Email: " +
                                  userList.data.docs[index].get('email')),
                              // userList.data.docs[index]['email'].toString()),*/
                              
                              onTap: () {
                                showModalBottomSheet(
                                  context: context,
                                  builder: (context) => Container(
                                    height: 500,
                                    child: Padding(
                                      padding: const EdgeInsets.all(20.0),
                                      child: Table(
                                        border: TableBorder(
                                            horizontalInside:
                                                BorderSide(width: 1)),
                                        children: _tableData.map((data) {
                                          return TableRow(
                                            children: [
                                              Container(
                                                padding: EdgeInsets.all(8.0),
                                                child: Text(data['id']),
                                              ),
                                              Container(
                                                padding: EdgeInsets.all(8.0),
                                                child: Text(data['content']),
                                              ),
                                            ],
                                          );
                                        }).toList(),
                                      ),
                                    ),
                                  ),
                                );
                              },
                            );
                          },
                        );
                      } else {

                        return Center(
                          child: CircularProgressIndicator(),
                        );
                      }
                    }),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Firestore 规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

FireStore 索引 enter image description here

我觉得代码盲,找不到我所依赖的基本错误。非常感谢帮助。

亲切的问候

您的 settings 字段是集合而不是文档,

所以你代码中的这两行是指你想要的数据:

   .doc('settings')
   .collection('userSettings')

它们应该是相反的,比如:

  Future<DocumentSnapshot> getUserList() async {
    return userList = await FirebaseFirestore.instance
        .doc('users/a@a.de/settings/userSettings')
        .get();
  }

之前的代码会 return 文档“userSettings”