Trying to add an "Events" collection to my Firebase Firestore using Flutter

Viewed 28

When I run my program I get an error that says this:

Error: Could not find the correct Provider<EventsServices> above this FormPage Widget

And it says this was in the stack:

When the exception was thrown, this was the stack: 
#0      Provider._inheritedElementOf (package:provider/src/provider.dart:332:7)
#1      Provider.of (package:provider/src/provider.dart:284:30)
#2      ReadContext.read (package:provider/src/provider.dart:610:21)
#3      _FormPageState.build.<anonymous closure> (package:localeventsapp/ui/homepage/form_widget.dart:204:29)
#4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:991:20)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#edec2
  debugOwner: GestureDetector
  state: possible
  won arena
  finalPosition: Offset(203.4, 442.0)
  finalLocalPosition: Offset(59.2, 21.6)
  button: 1
  sent tap down
====================================================================================================

The error points to this dart file I'm using as a form to collect some information that I want to append to Firebase Firestore but it won't store the data there because of this error I'm assuming.

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:date_time_picker/date_time_picker.dart';
import 'package:localeventsapp/events_services.dart';
import 'package:localeventsapp/model/Firebase_eventID.dart';
import 'package:provider/provider.dart';

CollectionReference userEvents = FirebaseFirestore.instance.collection("Events");
FirebaseAuth auth =  FirebaseAuth.instance;
String uid = auth.currentUser.uid.toString();


class FormPage extends StatefulWidget {
  @override
  _FormPageState createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  
  final TextEditingController eventNameController = TextEditingController();
  final TextEditingController locationController = TextEditingController();
  final TextEditingController descriptionController = TextEditingController();
  final TextEditingController creatorController = TextEditingController();
  String categoryID;
  int dateTime;
  // final TextEditingController dateController = TextEditingController();

  final GlobalKey<_FormPageState> _formKey = GlobalKey<_FormPageState>();

  Widget _buildName() {
    return TextFormField(
      controller: eventNameController,
      decoration: InputDecoration(
          labelText: 'Event Name',
          border:
              OutlineInputBorder(borderRadius: BorderRadius.circular(15.0))),
      validator: (String value) {
        if (value.isEmpty) {
          return 'Name is required';
        }
        return null;
      },
    );
  }

  Widget _buildLocation() {
    return TextFormField(
      controller: locationController,
      decoration: InputDecoration(
          labelText: 'Location',
          border:
              OutlineInputBorder(borderRadius: BorderRadius.circular(15.0))),
      validator: (String value) {
        if (value.isEmpty) {
          return 'Location is required';
        }
        return null;
      },
    );
  }

  Widget _buildDescription() {
    return TextFormField(
      controller: descriptionController,
      decoration: InputDecoration(
          labelText: 'Description',
          border:
              OutlineInputBorder(borderRadius: BorderRadius.circular(15.0))),
      validator: (String value) {
        if (value.isEmpty) {
          return 'Description is required';
        }
        return null;
      },
    );
  }

  Widget _buildCategory() {
    return DropdownButtonFormField<String>(
      items: [
        DropdownMenuItem<String>(
          child: Text('Music'),
          value: '1',
        ),
        DropdownMenuItem<String>(
          child: Text('Meet up'),
          value: '2',
        ),
        DropdownMenuItem<String>(
          child: Text('Golf'),
          value: '3',
        ),
        DropdownMenuItem<String>(
          child: Text('Birthday'),
          value: '4',
        ),
        DropdownMenuItem<String>(
          child: Text('Cook Out'),
          value: '5',
        ),
      ],
      onChanged: (String value) {
        setState(() {
          categoryID = value;
        });
      },
      value: categoryID,
      hint: Text('Category'),
    );
  }

  Widget _buildDate() {
    DateTime currentDate = DateTime.now();
    DateTimePicker(
    type: DateTimePickerType.dateTimeSeparate,
    dateMask: 'd MMM, yyyy',
    initialValue: DateTime.now().toString(),
    firstDate: DateTime(2000),
    lastDate: DateTime(2100),
    icon: Icon(Icons.event),
    dateLabelText: 'Date',
    timeLabelText: "Time",
    onChanged:
        (val) => print(val),
    validator: (val) {
      print(val);
      return null;
    },
    onSaved: (val) => print(val),
  );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: Text('Create Event'), backgroundColor: Color(0xFF6F35A5)),
      body: Container(
        margin: EdgeInsets.all(24),
        child: Form(
          key: _formKey,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              _buildName(),
              SizedBox(height: 10),
              _buildLocation(),
              SizedBox(height: 10),
              _buildDescription(),
              SizedBox(height: 10),
              Row(
                children: [
                  Align(
                    alignment: Alignment.bottomLeft,
                    child: Container(width:100, child: _buildCategory()),
                  ),
                  Spacer(),
                  Align(
                    alignment: Alignment.bottomRight ,
                    child: Container(width: 200, child: _buildDate()),
                    ),
                ],
              ),
              //_buildGuests(),
              SizedBox(height: 1),

              ElevatedButton(
                  child: Text('Create Event',
                      style: TextStyle(
                        color: Colors.black,
                        fontSize: 16,
                      )),
                  onPressed: () {
                    context.read<EventsServices>().addEvent(
                      eventName: eventNameController.text.trim(),
                      location: locationController.text.trim(),
                      description: descriptionController.text.trim(),
                      category: categoryID.trim(),
                      // dateTime: dateTime,
                      creatorUID: uid,
                    );

                  }),
            ],
          ),
        ),
      ),
    );
  }
}

I'm relatively new to Flutter so I'm not sure what I need to do. Any ideas?

1 Answers

I found out what was wrong. I hadn't included a provider in the main dart file. Now it works.

Related