Можно ли сохранить значение hintText в поле Textform в Flutter?

# #firebase #flutter #dart #flutter-layout #textfield

Вопрос:

Мне нужно сохранить значение внутри hintText в firebase. Это было значение, взятое с предыдущей страницы, и мне нужно сохранить его в базе данных. Я могу сохранить другое значение, введенное пользователем, но просто не могу сохранить текст подсказки. Есть ли какой-нибудь способ спасти его?

вот мой код виджета:

 //This is what I cannot save it
Widget getFacilityName() => TextFormField(
   //enableInteractiveSelection: false,
   readOnly: true,
    decoration: InputDecoration(
      labelText: 'Hospital / Clinic Name',
      floatingLabelBehavior: FloatingLabelBehavior.always,
      hintText: widget.facilityName,
      border: OutlineInputBorder(),
      suffixIcon: Icon(Icons.local_hospital),
    ),
    // validator: (value) {
    //   if (value.length < 1) {
    //     return 'Please enter your name';
    //   } else {
    //     return null;
    //   }
    // },
    onSaved: (hintText) => setState(() => facName = hintText),
  );


  Widget buildName() => TextFormField(
    decoration: InputDecoration(
      labelText: 'Name',
      border: OutlineInputBorder(),
      suffixIcon: Icon(Icons.person),
    ),
    validator: (value) {
      if (value.length < 1) {
        return 'Please enter your name';
      } else {
        return null;
      }
    },
    onSaved: (value) => setState(() => name = value),
  );

  Widget buildIc() => TextFormField(
    inputFormatters: [maskFormatter1],
    decoration: InputDecoration(
      labelText: 'IC Number',
      border: OutlineInputBorder(),
      suffixIcon: Icon(Icons.credit_card),
    ),
    validator: (value) {
      if (value.length < 1) {
        return 'Please enter your IC number';
      } else {
        return null;
      }
    },
    onSaved: (value) => setState(() => ic = value),
  );

   Widget buildPhoneNo() => TextFormField(
    inputFormatters: [maskFormatter2],
    decoration: InputDecoration(
      labelText: 'Phone Number',
      border: OutlineInputBorder(),
      suffixIcon: Icon(Icons.local_phone),
    ),
    validator: (value) {
      if (value.isEmpty) {
        return 'Please enter your phone number';
      }
      else if (value.length < 13 || value.length > 14) {
        return 'Please enter a valid phone number';
      } else {
        return null;
      }
    },
    onSaved: (value) => setState(() => phoneNo = value),
  );

  Widget buildDate() => DateTimeFormField(
    decoration: InputDecoration(
      labelText: 'Select Date amp; Time',
      border: OutlineInputBorder(),
      suffixIcon: Icon(Icons.event_note),
    ),
    firstDate: DateTime(DateTime.now().year),
    lastDate: DateTime(DateTime.now().year   5),
    validator: (value) {
      if (value == null) {
        return 'Please select a date';
      }
      else if(!value.isAfter(DateTime.now())){
        return 'Cannot book the date in the past';
      } else {
        return null;
      }
    },
    onSaved: (value) => setState(() => date = value),
  );

  Widget buildSubmit() => TextButton(
    child: Text('Confirm Appointment',
      style: TextStyle(
        fontSize: 18.0,
      ),),
    style: ButtonStyle(
      shape: MaterialStateProperty.all<RoundedRectangleBorder>(
        RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(28.0),
        )
      ),
      backgroundColor: MaterialStateProperty.all<Color>(Colors.blueGrey[300]),
      foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
    ),
    onPressed: () {
      final isValid = formKey.currentState.validate(); //check the validator

      //to hide keyboard after click submit
      FocusScope.of(context).unfocus();

      if(isValid) {
        formKey.currentState.save();
        FirebaseFirestore.instance.runTransaction((Transaction transaction) async{
          CollectionReference reference = FirebaseFirestore.instance.collection('Appointment');
          await reference.add({"facilityName": "$facName", "name": "$name", "ic": "$ic", "phoneno": "$phoneNo", "datetime": "$date"});
        });

      }
    },
  );
 

В моем огненном магазине я получаю вот так:
Скриншот из FireStore

Название объекта было пустым.

Ответ №1:

если вы получили hintText (значение widget.facilityName ) с предыдущей страницы, вы должны использовать его непосредственно в своем buildSubmit (потому что оно доступно только для чтения, и пользователь не изменит его!), как показано ниже:

 FirebaseFirestore.instance.runTransaction((Transaction transaction) async{
          CollectionReference reference = FirebaseFirestore.instance.collection('Appointment');
          await reference.add({"facilityName": "${widget.facilityName}", "name": "$name", "ic": "$ic", "phoneno": "$phoneNo", "datetime": "$date"});
        });
 

Ответ №2:

То , что вы хотите сделать, — это не сохранить значение hintText , на самом деле вы хотите сохранить значение переменной facilityName , полученной с предыдущей страницы, в firebase. поэтому просто отправил значение facilityName на базу огня.

просто добавьте значение widget.facilityName to facName перед этой строкой

 await reference.add({"facilityName": "$facName", "name": "$name", "ic": "$ic", "phoneno": "$phoneNo", "datetime": "$date"});
 

код будет примерно таким:

 //***
if(isValid) {
        formKey.currentState.save();
        FirebaseFirestore.instance.runTransaction((Transaction transaction) async{
          CollectionReference reference = FirebaseFirestore.instance.collection('Appointment');
          String facName = widget.facilityName;
          await reference.add({"facilityName": "$facName", "name": "$name", "ic": "$ic", "phoneno": "$phoneNo", "datetime": "$date"});
        });

}
//***
 

и удалите ненужные коды