Результат изменения данных Firestore равен нулю во флаттере - PullRequest
0 голосов
/ 04 августа 2020

Имя коллекции - userInfo, а данные, которые я хочу обновить, - это имя. Но когда я делаю это с использованием значения onChanged текстового поля, тогда метод обновления изменяет значение в документе коллекции на нулевое значение.

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:hindusofindia/model/user.dart';
import 'package:hindusofindia/screens/user/UserProfile.dart';

class EditName extends StatefulWidget {
  EditName({this.email});

  final String email;

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

class _EditNameState extends State<EditName> {
  void _changeName(String value) async {
    Firestore.instance
        .collection("userInfo")
        .document(widget.email)
        .updateData({"name": value});
  }

  @override
  Widget build(BuildContext context) {
    String nameChange='6767';

    return Scaffold(
      appBar: AppBar(
        title: Text('Edit Name'),
        flexibleSpace: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
              colors: <Color>[
                Colors.orange,
                Colors.red,
              ],
            ),
          ),
        ),
      ),
      body: Column(
        children: <Widget>[
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'Edit Name',
            ),
            onChanged: (text) {
              setState(() {
                nameChange = text;
              });
            },
          ),
          FlatButton(
            onPressed: () {
              if (nameChange != '6767') {
                _changeName(nameChange);
              }
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => UserScreen(
                    currentUser: User(email: widget.email),
                  ),
                ),
              );
            },
            child: Text('Apply changes'),
          )
        ],
      ),
    );
  }
}

Но что должно произойти, так это то, что изменение имени текстового поля приводит к обновлению значение имени в коллекции документов firebase к значению текстового поля. Изменения произойдут после нажатия плоской кнопки позже.

1 Ответ

1 голос
/ 04 августа 2020
onChanged: (text) {
  setState(() {
    nameChange = text;
});

setState() снова вызовет метод build(), чтобы перестроить дерево виджетов, но, поскольку вы объявили nameChange внутри метода build(), он будет иметь то же начальное значение при нажатии FlatButton. Вы должны объявить как переменную экземпляра в классе:

class _EditNameState extends State<EditName> {
String nameChange = "6767";
//...
...