Mrunal Joshi
Mrunal Joshi

Reputation: 377

Store documents from firestore in list

I am trying to retrieve documents from collection called "Org" and store it in list to display in the dropdownmenu, but the list returns [Instance of 'QueryDocumentSnapshot', Instance of 'QueryDocumentSnapshot'] and thus i get following error:

The method 'map' was called on null.
Receiver: null
Tried calling: map(Closure: (dynamic) => DropdownMenuItem<dynamic>)

This is the code i implemented:

void organisation() async {
    await Firebase.initializeApp();
    QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("Org").get();
    final List<DocumentSnapshot> list = querySnapshot.docs;
    print(list);
    list.forEach((data) => print(data));
  }
@override
  initState() {
    
    
    Firebase.initializeApp();
    organisation();
    
  
    super.initState();
  }

This is how i implemented dropdownmenu:

DropdownButtonFormField(
                          validator: (value) => value == "Select" ? 'Field required' : null,
                          value: _selectorg,
                                          onChanged: (val) => setState(() => _selectorg = val),
                                          
                                          items: list.map(
                                            (item) {
                                              return DropdownMenuItem(
                                                child: Text('$item'),
                                                value: item,
                                              );
                                            },
                                          ).toList(),
                                      hint: Text(
                                          "SELECT ORGANISATION",
                                          style: TextStyle(color: Colors.white)),
                                      
                      ),

Upvotes: 0

Views: 141

Answers (1)

Madhavam Shahi
Madhavam Shahi

Reputation: 1192

Try this,

@override
  initState() {
    
    
    
  
    super.initState();
Firebase.initializeApp();
    organisation();
    
  }

And,

Declare your list outside the function

final List<DocumentSnapshot> list;

void organisation() async {
    await Firebase.initializeApp();
    QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("Org").get();
    list = querySnapshot.docs;
    print(list);
    list.forEach((data) => print(data));
  }

Update

StreamBuilder(
    stream: FirebaseFirestore.instance.collection("Org").get();
    builder: (BuildContext context,
        AsyncSnapshot<QuerySnapshot> snapshots) {
      if (snapshots.connectionState == ConnectionState.active &&
          snapshots.hasData) {
        print(snapshots.data);
        return ListView.builder(
          itemCount: snapshots.docs.length,
          itemBuilder: (BuildContext context, int index) {
            DocumentSnapshot doc = snapshots.data[index];
            Map data= doc.data;//This is your data
            return Text(
              data.toString(),
            );
          },
        );
      } else {
        return Center(child: CircularProgressIndicator());
      }
    },
  ),

Upvotes: 1

Related Questions