I am not able to retrieve data from firebase database in my flutter app. I don't know what is wrong in my code

1

I am putting up 3 .dart files which are required for the app.

StaffEvent.dart

import 'package:flutter/material.dart';
import 'package:flutter_new_app/addevent_screen.dart';
import 'package:flutter_new_app/services/crud.dart';

class StaffEvent extends StatefulWidget {
  @override
  _StaffEventState createState() => _StaffEventState();
}

class _StaffEventState extends State<StaffEvent> {
  CrudMethods crudMethods = new CrudMethods();
  QuerySnapshot eventSnapshot;
  Stream eventStream;

  // ignore: non_constant_identifier_names
  Widget EventList() {
    return Container(
      child: eventStream != null
          ? Column(
              children: [
                StreamBuilder(
                  stream: eventStream,
                  builder: (context, snapshot) {
                    return ListView.builder(
                      padding: EdgeInsets.symmetric(horizontal: 16),
                      itemCount: eventSnapshot.docs.length,
                      shrinkWrap: true,
                      itemBuilder: (context, index) {
                        return EventTile(
                          title: eventSnapshot.docs[index].data()['title'],
                          desc: eventSnapshot.docs[index].data()['desc'],
                          date: eventSnapshot.docs[index].data()['date'],
                        );
                      },
                    );
                  },
                ),
              ],
            )
          : Container(
              alignment: Alignment.center,
              child: CircularProgressIndicator(),
            ),
    );
  }

  @override
  void initState() {
    setState(() {
      Stream result;
      eventStream = result;
    });

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFFffffff),
      appBar: AppBar(
        actions: [
          FloatingActionButton(
            backgroundColor: Colors.green,
            child: Icon(Icons.add),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => AddEvent()),
              );
            },
          )
        ],
        backgroundColor: Color(0xFFebd8b7),
        title: Text(
          'Events',
          style: TextStyle(color: Colors.black),
        ),
      ),
    );
  }
}

// ignore: must_be_immutable
class EventTile extends StatelessWidget {
  String title, desc, date;
  EventTile({@required this.title, @required this.desc, @required this.date});

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ClipRRect(
          borderRadius: BorderRadius.circular(6),
          child: SizedBox(
            width: 500,
            height: 80,
            child: Container(
              color: Color(0xFFeaffd0),
              child: Column(
                children: [
                  Text(
                    title,
                    textAlign: TextAlign.center,
                    style: TextStyle(fontSize: 25, fontWeight: FontWeight.w500),
                  ),
                  Text(
                    desc,
                    style: TextStyle(fontSize: 17, fontWeight: FontWeight.w400),
                  ),
                  Text(
                    date,
                    style: TextStyle(fontSize: 17, fontWeight: FontWeight.w400),
                  )
                ],
              ),
            ),
          ),
        ),
      ],
    );
  }
}

Crud.dart

import 'package:cloud_firestore/cloud_firestore.dart';

class CrudMethods {
  Future<void> addData(eventData) async {
    FirebaseFirestore.instance
        .collection("events")
        .add(eventData)
        .catchError((e) {
      print(e);
    });
  }

  getData() async {
    return await FirebaseFirestore.instance.collection("events").get();
  }
}

Addevent.dart

import 'package:flutter_new_app/services/crud.dart';

class AddEvent extends StatefulWidget {
  @override
  _AddEventState createState() => _AddEventState();
}

class _AddEventState extends State<AddEvent> {
  String title, desc, date;
  CrudMethods crudMethods = new CrudMethods();

  uploadEvent() async {
    Map<String, String> eventMap = {"title": title, "desc": desc, "date": date};

    crudMethods.addData(eventMap).then((result) {
      Navigator.pop(context);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Color(0xFFffffff),
        appBar: AppBar(
          backgroundColor: Color(0xFFf38181),
          title: Text(
            'Add Event',
            style: TextStyle(color: Colors.black),
          ),
          actions: <Widget>[
            GestureDetector(
              onTap: () {
                uploadEvent();
              },
              child: Container(
                  padding: EdgeInsets.symmetric(horizontal: 16),
                  child: Icon(Icons.file_upload)),
            )
          ],
        ),
        body: Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(hintText: "Event Name"),
                onChanged: (val) {
                  title = val;
                },
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(hintText: "Description"),
                onChanged: (val) {
                  desc = val;
                },
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(hintText: "Date"),
                onChanged: (val) {
                  date = val;
                },
              ),
            )
          ],
        ));
  }
}

So here basically, the user has to enter some details for an event and when clicking the upload button it should be visible as a list in the Staffevent page . That is the problem. Nothung is showing in the Staffevent page. It is blank. The data is being stored in the firebase database but when i am using snapshot and calling it back it is not showing in my flutter application.

database
firebase
flutter
asked on Stack Overflow Apr 30, 2021 by Ankitha Anil

1 Answer

1
  1. Your stream is empty:
      Stream result;
      eventStream = result;
  1. Firebase Firestore get() method returns a Future<DocumentSnapshot>:
  Future<DocumentSnapshot> getData() async {
    return await FirebaseFirestore.instance.collection("events").get();
  }

If you need a stream you use snapshots() method which returns a Stream:

  Stream collectionStream = FirebaseFirestore.instance.collection("events").snapshots();
  

Please refer to official documentation to get familiar with Firebase API.

answered on Stack Overflow Apr 30, 2021 by Simon Sot

User contributions licensed under CC BY-SA 3.0