Flutter Firestore QuerySnapshot с uid

#flutter #google-cloud-firestore

# #флаттер #google-облако-firestore

Вопрос:

в моем приложении Flutter мне нужно получить массив данных из Firestore с помощью uid, но ни один из моих вариантов кода не работает так, как я хочу.

Вот мои коды:

Когда я использую это, я не могу получить какие-либо данные из Firestore

 Future<List<DocumentSnapshot>> getData() async {
    final FirebaseAuth auth = FirebaseAuth.instance;
    final User user = auth.currentUser;
    final uid = user.uid;



    var firestore = FirebaseFirestore.instance;
    QuerySnapshot qn = await firestore
        .collection("users")
        .where("user" , isEqualTo: uid).get();


    return qn.docs;
}
 

Когда я изменяю код таким образом, я могу получить массивы всех пользователей.
Но я не хочу получать данные всех пользователей — я просто хочу взять массивы текущего пользователя.
Как я могу это сделать?

 Future<List<DocumentSnapshot>> getData() async {
    final FirebaseAuth auth = FirebaseAuth.instance;
    final User user = auth.currentUser;
    final uid = user.uid;

    var firestore = FirebaseFirestore.instance;
    QuerySnapshot qn = await firestore
        .collection("users")
        .get();
    return qn.docs;
}
 

именно так я принимаю значения:

     @override
   Widget build(BuildContext context) {
     final _width = MediaQuery
    .of(context)
    .size
    .width;
     final _height = MediaQuery
    .of(context)
    .size
    .height;
     return Scaffold(


       body: FutureBuilder(
      future: getData(),
      builder: (_, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
        if(snapshot.hasData){
          return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (_, index) {
                return Column(
                  children: [
                    Card(
                      child: SingleChildScrollView(
                        child: Column(
                          children: [
                            Container(
                                alignment: Alignment.center,
                              color: Colors.black,

                             height: 50, width: _width/2,
                                child: Text(

                                  snapshot.data[index].data()["arrayData"][index]["doOne"].toString(),

                                  style: TextStyle(color: Colors.white,fontSize: 24),)),

                            Container(
                              alignment: Alignment.center,
                                color: Colors.black,

                                height: 50, width: _width/2,
                                child: Text(

                               snapshot.data[index].data()["arrayData"][index]["doTwo"].toString(),

                                  style: TextStyle(color: Colors.white,fontSize: 24),)),
                          ],
                        ),
                      ),
                    ),
                    
                  ],
                );
              }


          );

        }

        return CircularProgressIndicator();


      }
  ),
  );
 }
 

введите описание изображения здесь

Комментарии:

1. Можете ли вы отредактировать свой вопрос, чтобы показать скриншот документа / a, который, как вы ожидаете, вернет запрос?

Ответ №1:

Попробуйте это:

 QuerySnapshot qn = await firestore.collection("users").doc(uid).get();
 

Комментарии:

1. Когда я меняюсь подобным образом, flutter хочет изменить QuerySnapshot на DocumentSnapshot

2. qn.data() насколько я помню, ваша среда разработки должна давать вам рекомендации

3. Или qn.doc.data()

4. Я попробовал оба из них, но IDE не дал никаких предложений: D

Ответ №2:

Я исправил эту проблему следующим образом

  class ListScreenTwo extends StatelessWidget {
 @override
 Widget build(BuildContext context) {


final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final uid = user.uid;

// get the course document using a stream
Stream<DocumentSnapshot> courseDocStream = FirebaseFirestore.instance
    .collection('users')
    .doc(uid)
    .snapshots();

return Scaffold(
  body: Container(
    alignment: Alignment.center,

    height: 400, width: 300,

    child: StreamBuilder<DocumentSnapshot>(
        stream: courseDocStream,
        builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {

            
            var courseDocument = snapshot.data.data;


            var sections = courseDocument()['arrayData'];

            // build list using names from sections
            return ListView.builder(
              itemCount: sections != null ? sections.length : 0,
              itemBuilder: (_, int index) {

                return ListTile(
                    title: Container(
                      child: Column(
                        children: [
                          Text(sections[index]['doOne']),
                          Text(sections[index]['doTwo']),
                        ],
                      ),
                    ));
              },
            );
          } else {
            return Container();
          }
        }),
  ),
);
 }
}