title: How do I write to firebase using a TextFormField in a ListView in flutter
body: <p>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 <code>TextEditingController()</code> pass through to other pages. I've attached the relevant pages of code below.</p>
  <p>admin_exercise.dart
  this creates both list views this is then passed to  admin_screen.dart</p>
  <pre><code>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&lt;ExerciseView&gt; createState() =&gt; _ExerciseViewState();
  }
  
  class _ExerciseViewState extends State&lt;ExerciseView&gt; {
    void getUsers() {
      users.email.toString();
    }
  
    var selectedUser;
    bool setDefaultUser = true;
  
    var selectedExercise;
    bool setDefaultExercise = true;
  
    int set1 = 0;
  
    List&lt;Widget&gt; _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&lt;QuerySnapshot&gt;(
                  stream: _firestore
                      .collection('exercises')
                      .orderBy('Title')
                      .snapshots(),
                  builder: (BuildContext context,
                      AsyncSnapshot&lt;QuerySnapshot&gt; 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&lt;void&gt; insertData(final reps) async {
      _firestore.collection(&quot;plans&quot;).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,
                ),
              ),
            ],
          ),
        ],
      );
    }
  }
  </code></pre>
  <p>admin_screen.dart</p>
  <pre><code>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&lt;AdminScreen&gt; createState() =&gt; _AdminScreenState();
  }
  
  class _AdminScreenState extends State&lt;AdminScreen&gt; {
    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 = &quot;&quot;; //set the initial value of text field
      super.initState();
    }
  
    List&lt;Widget&gt; _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: &quot;Enter Date&quot; //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 =&gt; 2021-03-10 00:00:00.000
                          String formattedDate =
                              DateFormat('yyyy-MM-dd').format(pickedDate);
                          print(
                              formattedDate); //formatted date output using intl package =&gt;  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(&quot;Date is not selected&quot;);
                        }
                      },
                    ))),
                Center(
                  child: StreamBuilder&lt;QuerySnapshot&gt;(
                    stream: _firestore
                        .collection('users')
                        .orderBy('email')
                        .snapshots(),
                    builder: (BuildContext context,
                        AsyncSnapshot&lt;QuerySnapshot&gt; 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
  </code></pre>