problem in flutter with fireStore in QuerySnapshot its always null

Viewed 345

i wil put all the code below this explanation

so i just create a CollectionReference like this

in class DataBaseServices

 final CollectionReference brewCollection =
      Firestore.instance.collection('brews');

and i add data normally

after i use it in stream

 Stream<QuerySnapshot> get brews {
    return brewCollection.snapshots();
  }

and i put the value in widget

Widget build(BuildContext context) {
    return StreamProvider<QuerySnapshot>.value(
      value: DataBaseServices().brews,

and in another widget i call it

   final snapshot = Provider.of<QuerySnapshot>(context);

and after i check here if it is null i find that it is null

the code :

class database

import 'package:cloud_firestore/cloud_firestore.dart';

class DataBaseServices {
 final CollectionReference brewCollection =
     Firestore.instance.collection('brews');

 final String uid;

 DataBaseServices({this.uid});

 Future updateUserData({int sugar, String name, int strength}) async {
   return await brewCollection.document(uid).setData(
     {'sugar': sugar, 'name': name, 'strength': strength},
   );
 }

 Stream<QuerySnapshot> get brews {
   return brewCollection.snapshots();
 }
} 

home class

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:crewbrewapp/screens/home/brews_list.dart';
import 'package:crewbrewapp/services/auth.dart';
import 'package:crewbrewapp/services/database.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Home extends StatefulWidget {
 @override
 _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
 AuthServices _auth = AuthServices();

 @override
 Widget build(BuildContext context) {
   return StreamProvider<QuerySnapshot>.value(
     value: DataBaseServices().brews,
     child: Scaffold(
       backgroundColor: Colors.brown.shade100,
       appBar: AppBar(
         title: Text('Home'),
         centerTitle: true,
         backgroundColor: Colors.brown.shade500,
         actions: <Widget>[
           FlatButton.icon(
             icon: Icon(Icons.person),
             label: Text('Log out'),
             onPressed: () async {
               await _auth.signOut();
             },
           ),
         ],
         leading: Icon(Icons.menu),
       ),
       body: BrewsList(),
     ),
   );
 }
}

class brewList

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:crewbrewapp/screens/home/brew_tile.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:crewbrewapp/models/brew.dart';

class BrewsList extends StatefulWidget {
  @override
  _BrewsListState createState() => _BrewsListState();
}

class _BrewsListState extends State<BrewsList> {
  List<Brew> brews;
  @override
  Widget build(BuildContext context) {
    final snapshot = Provider.of<QuerySnapshot>(context);


    if (snapshot != null) {
      snapshot.documents.map(
        (element) {
          brews = [
            Brew(
              sugar: element.data['sugar'] ?? 0,
              strength: element.data['strength'] ?? 0,
              name: element.data['name'] ?? '',
            ),
          ];
        },
      );
    }
    return brews == null
        ? Container(
            child: Text('Empty'),
          )
        : ListView.builder(
            itemCount: brews.length,
            itemBuilder: (context, index) {
              return BrewTile(brew: brews[index]);
            },
          );
  }
}


i tried everything but it still show nothing

3 Answers

Rather you should assign brews to the whole map:

if (snapshot != null) {
      brews = snapshot.documents.map(
        (element) {
            return Brew(
              sugar: element.data['sugar'] ?? 0,
              strength: element.data['strength'] ?? 0,
              name: element.data['name'] ?? '',
            );
        },
      ).toList();
    } 

I believe your snapshot is not quite created by the time it is called in brewList.

A progress indicator may work for you;

if (snapshot == null) return CircularProgressIndicator();

      snapshot.documents.map(
        (element) {
          brews = [
            Brew(
              sugar: element.data['sugar'] ?? 0,
              strength: element.data['strength'] ?? 0,
              name: element.data['name'] ?? '',
            ),
          ];
        
      );
    }
  1. add if
  2. call doc.data() - data with () operator ,see below code in the class BrewList:
final brews = Provider.of<QuerySnapshot>(context);
    //print(brews);
    if (brews != null) {
      for (var doc in brews.docs) {
        print(doc.data());
      }
    }
  1. call BrewList() class with provider from Home class, see below code in the class Home :
> return StreamProvider<QuerySnapshot>.value(
        >         initialData: null,
        >         value: DatabaseBrews(uid:'').brews,
        >         child: Scaffold(... 
        >         body: BrewList(),)
Related