'How do I write to firebase using a TextFormField in a ListView in flutter

Hi Im trying to use List views to make the UI more interactive and appealing, however I cant figure out a way to pass the TextEditingController() pass through to other pages. I've attached the relevant pages of code below.

admin_exercise.dart this creates both list views this is then passed to admin_screen.dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

final _firestore = Firestore.instance;
late FirebaseUser users;

class ExerciseView extends StatefulWidget {
  const ExerciseView({Key? key}) : super(key: key);

  @override
  State<ExerciseView> createState() => _ExerciseViewState();
}

class _ExerciseViewState extends State<ExerciseView> {
  void getUsers() {
    users.email.toString();
  }

  var selectedUser;
  bool setDefaultUser = true;

  var selectedExercise;
  bool setDefaultExercise = true;

  int set1 = 0;

  List<Widget> _cardList = [];

  void _addCardWidget() {
    setState(() {
      _cardList.add(SetCard(
        setNo: (set1 + 1),
        exercise: selectedExercise,
      ));
    });
  }

  void _deleteCardWidget() {
    setState(() {
      _cardList.removeLast();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Center(
              child: StreamBuilder<QuerySnapshot>(
                stream: _firestore
                    .collection('exercises')
                    .orderBy('Title')
                    .snapshots(),
                builder: (BuildContext context,
                    AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (!snapshot.hasData) return Container();

                  if (setDefaultExercise) {
                    selectedExercise = snapshot.data?.documents[0]['Title'];
                  }
                  return DropdownButton(
                    isExpanded: false,
                    value: selectedExercise,
                    items: snapshot.data?.documents.map((value2) {
                      return DropdownMenuItem(
                        value: value2['Title'],
                        child: Text('${value2['Title']}'),
                      );
                    }).toList(),
                    onChanged: (value2) {
                      setState(
                        () {
                          // Selected value will be stored
                          selectedExercise = value2;

                          // Default dropdown value won't be displayed anymore
                          setDefaultExercise = false;
                        },
                      );
                    },
                  );
                },
              ),
            ),
            ElevatedButton(
                onPressed: () {
                  setState(() {
                    _addCardWidget();
                    set1++;
                  });
                },
                child: Icon(Icons.add)),
            Text('Sets: $set1'),
            ElevatedButton(
                onPressed: () {
                  _deleteCardWidget();
                  setState(() {
                    set1--;
                  });
                },
                child: Icon(Icons.remove))
          ],
        ),
        ListView.builder(
            physics: NeverScrollableScrollPhysics(),
            shrinkWrap: true,
            itemCount: _cardList.length,
            itemBuilder: (context, index) {
              return _cardList[index];
            }),
      ],
    );
  }
}

class SetCard extends StatelessWidget {
  SetCard({required this.setNo, required this.exercise});

  late int setNo;
  late String exercise;
  final repTextController = TextEditingController();
  final notesTextController = TextEditingController();

  Future<void> insertData(final reps) async {
    _firestore.collection("plans").add(reps).then((DocumentReference document) {
      print(document.documentID);
    }).catchError((e) {
      print(e);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        // added in exercise here to help to understand how to write to firebase
        Text('Set $setNo, $exercise'),
        Row(
          children: [
            Expanded(
              flex: 1,
              child: TextFormField(
                controller: repTextController,
                decoration: InputDecoration(hintText: 'Reps...'),
                keyboardType: TextInputType.number,
              ),
            ),
            SizedBox(
              width: 10,
            ),
            Expanded(
              flex: 4,
              child: TextFormField(
                controller: notesTextController,
                decoration: InputDecoration(hintText: 'Notes...'),
                keyboardType: TextInputType.number,
              ),
            ),
          ],
        ),
      ],
    );
  }
}

admin_screen.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:intl/intl.dart';
import 'package:fitness_guide/components/admin_exercise.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class AdminScreen extends StatefulWidget {
  static const String id = 'AdminScreen';

  const AdminScreen({Key? key}) : super(key: key);

  @override
  State<AdminScreen> createState() => _AdminScreenState();
}

class _AdminScreenState extends State<AdminScreen> {
  TextEditingController dateinput = TextEditingController();

  final _auth = FirebaseAuth.instance;
  final _firestore = Firestore.instance;
  late FirebaseUser users;

  void getUsers() {
    users.email.toString();
  }

  var selectedUser;
  bool setDefaultUser = true;

  var selectedExercise;
  bool setDefaultExercise = true;

  int set1 = 0;

  @override
  void initState() {
    dateinput.text = ""; //set the initial value of text field
    super.initState();
  }

  List<Widget> _exerciseList = [];

  void _addExerciseWidget() {
    setState(() {
      _exerciseList.add(ExerciseView());
    });
  }

  void _deleteExerciseWidget() {
    setState(() {
      _exerciseList.removeLast();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () {
          //submit to fbase here
        },
        label: const Text('Submit'),
        icon: const Icon(Icons.thumb_up),
        backgroundColor: Color(0xff75D6F2),
      ),
      body: ListView(
        physics: BouncingScrollPhysics(),
        children: [
          Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              SizedBox(
                height: 20,
              ),
              Container(
                  padding: EdgeInsets.symmetric(horizontal: 15),
                  height: 50,
                  child: Center(
                      child: TextField(
                    controller:
                        dateinput, //editing controller of this TextField
                    decoration: InputDecoration(
                        icon: Icon(Icons.calendar_today), //icon of text field
                        labelText: "Enter Date" //label text of field
                        ),
                    readOnly:
                        true, //set it true, so that user will not able to edit text
                    onTap: () async {
                      DateTime? pickedDate = await showDatePicker(
                          context: context,
                          initialDate: DateTime.now(),
                          firstDate: DateTime(
                              2000), //DateTime.now() - not to allow to choose before today.
                          lastDate: DateTime(2101));

                      if (pickedDate != null) {
                        print(
                            pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
                        String formattedDate =
                            DateFormat('yyyy-MM-dd').format(pickedDate);
                        print(
                            formattedDate); //formatted date output using intl package =>  2021-03-16
                        //you can implement different kind of Date Format here according to your requirement

                        setState(() {
                          dateinput.text =
                              formattedDate; //set output date to TextField value.
                        });
                      } else {
                        print("Date is not selected");
                      }
                    },
                  ))),
              Center(
                child: StreamBuilder<QuerySnapshot>(
                  stream: _firestore
                      .collection('users')
                      .orderBy('email')
                      .snapshots(),
                  builder: (BuildContext context,
                      AsyncSnapshot<QuerySnapshot> snapshot) {
                    // Safety check to ensure that snapshot contains data
                    // without this safety check, StreamBuilder dirty state warnings will be thrown
                    if (!snapshot.hasData) return Container();
                    // Set this value for default,
                    // setDefault will change if an item was selected
                    // First item from the List will be displayed
                    if (setDefaultUser) {
                      selectedUser = snapshot.data?.documents[0]['email'];
                    }
                    return DropdownButton(
                      isExpanded: false,
                      value: selectedUser,
                      items: snapshot.data?.documents.map((value1) {
                        return DropdownMenuItem(
                          value: value1['email'],
                          child: Text('${value1['email']}'),
                        );
                      }).toList(),
                      onChanged: (value1) {
                        setState(
                          () {
                            // Selected value will be stored
                            selectedUser = value1;
                            // Default dropdown value won't be displayed anymore
                            setDefaultUser = false;
                          },
                        );
                      },
                    );
                  },
                ),
              ),

              //Row below for the first exercise sets etc
              ListView.builder(
                  physics: NeverScrollableScrollPhysics(),
                  shrinkWrap: true,
                  itemCount: _exerciseList.length,
                  itemBuilder: (context, index) {
                    return _exerciseList[index];
                  }),
              Center(
                child: Text('Add another Exercise...'),
              ),
              ElevatedButton(
                onPressed: () {
                  _addExerciseWidget();
                },
                child: Icon(Icons.add),
              ),
            ],
          ),
        ],
      ),
    );
  }
}```



p.s. sorry for any spagetti code 

[Image shows the layout UI I'm trying to achieve][1]


  [1]: https://i.stack.imgur.com/d3qxg.png


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source