Flutter: How to post user feedback from feed back form to the Firestore Database

674 Views Asked by At

I am new to Flutter and trying to capture user feedback from the feedback form below to Firestore Database and have it displayed on a separate screen that reads from the Database and displays user feedback a report?

class FeedbackScreen extends StatefulWidget {
    static const String routeName = 'feedback_screen';

    @override
    _FeedbackScreenState createState() => _FeedbackScreenState();
    }

   class _FeedbackScreenState extends State<FeedbackScreen> {
   List<String> _questions = [
    'Question 1',
    'Question 2 ',
    'Question 3',
    'Question 4'
    ];
    List<int> _feedbackValue = [];

    List<bool> _isFormFieldComplete = [];

    String additionalComments;

    @override
    void initState() {
    super.initState();
    for (int i = 0; i < _questions.length; ++i) {
      _feedbackValue.add(-1);
      _isFormFieldComplete.add(false);
    }
   }

    @override
   Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          getTranslated(context, "feedback_screen"),
        ),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                'Please choose appropriate emoji icon for your response',
                style: kFeedbackFormFieldTextStyle,
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: 10.0,
              ),
              Text(
                getTranslated(context, "tons_emoji"),
                style: kFeedbackFormFieldTextStyle,
              ),
              SizedBox(
                height: 10.0,
              ),
              Text(
                getTranslated(context, "alot_emoji"),
                style: kFeedbackFormFieldTextStyle,
              ),
              SizedBox(
                height: 10.0,
              ),
              Text(
                getTranslated(context, "soso_emoji"),
                style: kFeedbackFormFieldTextStyle,
              ),
              SizedBox(
                height: 10.0,
              ),
              Text(
                getTranslated(context, "notgood_emoji"),
                style: kFeedbackFormFieldTextStyle,
              ),
              Divider(
                height: 25.0,
              ),
            ]
              ..addAll(
                _questions.asMap().entries.map((entry) {
                  return FeedbackFormField(
                    id: entry.key + 1,
                    question: entry.value,
                    groupValue: _feedbackValue[entry.key],
                    radioHandler: (int value) =>
                        _handleRadioButton(entry.key, value),
                    error: _isFormFieldComplete[entry.key]
                        ? 'This is a required field'
                        : null,
                  );
                }),
              )
              ..addAll([
                SizedBox(
                  height: 10.0,
                ),
                TextField(
                  decoration: kFeedbackFormFieldDecoration.copyWith(
                    hintText: 'Additional Comments (Optional)',
                  ),
                  maxLines: 5,
                  onChanged: (value) => additionalComments = value,
                ),
                SizedBox(
                  height: 20.0,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    CustomRaisedButton(
                      save: handleSubmitFeedback,
                      title: 'Submit',
                    ),
                  ],
                ),
              ]),
          ),
        ),
      ),
    );
    }
    void _handleRadioButton(int group, int value) {
    setState(() {
      _feedbackValue[group] = value;
      _isFormFieldComplete[group] = false;
    });
   }

   void handleSubmitFeedback() {
    bool complete = true;
    for (int i = 0; i < _feedbackValue.length; ++i) {
      if (_feedbackValue[i] == -1) {
        complete = false;
        _isFormFieldComplete[i] = true;
      } else {
        _isFormFieldComplete[i] = false;
      }
    }
    setState(() {});
    if (complete == true) {
      print(_feedbackValue);
      print(additionalComments);
      Navigator.pushReplacementNamed(context, SessionTwoScreen.routeName);
    }
   }
   }
1

There are 1 best solutions below

3
On

you can try creating a function like this:

final firestoreInstance = FirebaseFirestore.instance;

void _onPressed(){
  firestoreInstance.collection("users").add(
  {
    "userName" : "johnDoe",
    ...otherFields
    }
  }).then((_){
    print("data added successfully!");
  });
}

You can check the documentation to see a detailed example of the same. Also from the docs "By default, Firestore references manipulate a Map<String, dynamic> object. The downside is that we lose type safety." So you can type your references as shown here