Радиокнопка Flutter при изменении не обновляет Firebase - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в флаттере, пытаюсь сделать CRUD и у меня проблема. На моем экране обновления я могу отправить все поля моей формы в Firebase Firestore, кроме радиополей. Эта проблема возникает только при обновлении, потому что при создании rad ios работают хорошо. Я не вижу, где я ошибаюсь в обновлении, не могли бы вы мне помочь?

Ниже приведен код моего класса

class _DetailFormState extends State<DetailForm> {
  final DataRepository repository = DataRepository();
  final _formKey = GlobalKey<FormBuilderState>();

  String sex;

  @override
  void initState() {       
    sex = widget.user.sex;
    super.initState();
  }

Это мои переключатели:

      ListTile(
        title: Align(
          child: new Text("Female"),
          alignment: Alignment(-1.2, 0),
        ),
        leading: Radio(
          value: "female",
          groupValue: widget.user.sex,
          onChanged: (String value) {
            setState(() {
              widget.user.sex = value;
            });
          },
        ),
      ),
      ListTile(
        title: Align(
          child: new Text("Male"),
          alignment: Alignment(-1.2, 0),
        ),
        leading: Radio(
          value: "male",
          groupValue: widget.user.sex,
          onChanged: (String value) {
            setState(() {
              widget.user.sex = value;
            });
          },
        ),
      ),

Здесь я вызываю свой репозиторий Firebase для сохранения данных. Как я сказал ранее, я могу сохранить любое поле, кроме радио. Это моя проблема. Сообщение об ошибке не появляется. Данные просто не обновляются в Firebase

  Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: <Widget>[
                  MaterialButton(
                      color: Colors.blue.shade600,
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      child: Text(
                        "Cancel",
                        style: TextStyle(color: Colors.white, fontSize: 12.0),
                      )),
    MaterialButton(
                      color: Colors.blue.shade600,
                      onPressed: () async {
                        Navigator.of(context).pop();                   
                        widget.user.sex = sex;
                        repository.updateUser(widget.user);  

                      },
                      child: Text(
                        "Update",
                        style: TextStyle(color: Colors.white, fontSize: 12.0),
                      )),
                ],
              ),

Edit 1

  updateUser(User user) async {
    await collection
        .document(user.reference.documentID)
        .updateData(user.toJson());
  }

1 Ответ

0 голосов
/ 05 мая 2020

Я нашел проблему. Я помещал значение виджета для получения значения переменной, которая уже была в Firebase:

onPressed: () async {
                        Navigator.of(context).pop();                   
                        widget.user.sex = sex;
                        repository.updateUser(widget.user);  

                      }

Фактически, должно быть сделано обратное. Переменная, которая находится в Firebase, получает значение, которое находится в виджете:

onPressed: () async {
                            Navigator.of(context).pop();                   
                            sex = widget.user.sex;
                            repository.updateUser(widget.user);  

                          }
...