Home > Back-end >  Why when i add data to firebase, the data keep looping?
Why when i add data to firebase, the data keep looping?

Time:12-17

I'm new to flutter and firebase and I do not know why when I upload any data to firebase the data will keep repeating the same thing but when I hot restart the upload item back to 1, this is my code:

Future getDocId() async {
await FirebaseFirestore.instance
    .collection('users')
    .orderBy('mobile', descending: true)
    .get()
    .then(
      (snapshot) => snapshot.docs.forEach(
        (document) {
          print(document.reference);
          docIDs.add(document.reference.id);
        },
      ),
    );

}

body: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Expanded(
          child: FutureBuilder(
            future: getDocId(),
            builder: (context, snapshot) {
              return ListView.builder(
                itemCount: docIDs.length,
                itemBuilder: (context, index) {
                  return Padding(
                    padding: const EdgeInsets.all(10.0),
                    child: ListTile(
                      title: ReadUser(documentId: docIDs[index]),
                      tileColor: Colors.purple[100],
                    ),
                  );
                },
              );
            },
          ),
        ),

This is my future builder

 return FutureBuilder<DocumentSnapshot>(
  future: users.doc(documentId).get(),
  builder: ((context, snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      Map<String, dynamic> data =
          snapshot.data!.data() as Map<String, dynamic>;
      return Text('Name:'  
          '${data['name']}'  
          "\n"
              'Email:'  
          '${data['email']}'  
          "\n"
              'Mobile Number:'  
          ' '  
          '${data['mobile']}'  
          "");
    }
    return Text('Loading..');
  }),
);

CodePudding user response:

the way you are fetching your data is wrong, instead of pass the result into outside variable you need to return it like this, I assume docIDs is a list of string:

Future<List<String>> getDocId() async {
    try {
      var snapshot = await FirebaseFirestore.instance
          .collection('users')
          .orderBy('mobile', descending: true)
          .get();
      return snapshot.docs.map((document) => document.reference.id).toList();
    } catch (e) {
      return [];
    }
  }

then change your FutureBuilder to this:

FutureBuilder<List<String>>(
  future: getDocId(),
  builder: (context, snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
        return Text('Loading....');
      default:
        if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          List<String> data = snapshot.data ?? [];
          return ListView.builder(
            itemCount: data.length,
            itemBuilder: (context, index) {
              return Padding(
                padding: const EdgeInsets.all(10.0),
                child: ListTile(
                  title: ReadUser(documentId: data[index]),
                  tileColor: Colors.purple[100],
                ),
              );
            },
          );
        }
    }
  },
),
  • Related