Как обновить данные в Firestore от флаттера - PullRequest
1 голос
/ 25 апреля 2019

В моем приложении есть страница настроек, которую пользователь может редактировать, чтобы обновить детали.Экран данных состоит из двух двух текстовых полей и аватара профиля.Приложение имеет Google (и адрес электронной почты и пароль) в качестве провайдеров аутентификации.Поэтому, когда пользователь регистрируется впервые, у меня есть метод, который представляет данные пользователю.

void readLocal() async {

    controllerName = new TextEditingController(text: AuthProvider.of(context).userData.name);
    print(controllerName);
    controllerEmail = new TextEditingController(text: AuthProvider.of(context).userData.email);
    avatarUrl= AuthProvider.of(context).userData.avatarUrl;
   // controllerPhoneNumber= new TextEditingController(text: AuthProvider.of(context).userData.phoneNumber);

    // Force refresh input
    setState(() {});
  }

Данные представлены в соответствии с ожиданиями.Метод вызывается в

 @override
  void didChangeDependencies() {
    readLocal();

  }

Чтобы убедиться, что initState завершен.У меня есть кнопка обновления, которая работает не так, как хотелось бы.Когда я редактирую оба поля: оба поля обновляются, и правильные записи отправляются в Firestore.Однако, если я обновляю один TextField и нажимаю обновление, я теряю данные в другом TextField (пустая строка записывается в Firestore) и наоборот.И если я нажимаю обновление, не редактируя ни одно из полей, оба поля в Firestore заканчиваются пустыми строками.Вот моя функция обновления

void handleUpdateData() {
    focusName.unfocus();
    focusEmail.unfocus();


    setState(() {
      isLoading = true;
    });
    AuthProvider.of(context).userData.docRef.updateData({'name': name, 'email': email,'avatarUrl':avatarUrl}).then((data) async{
      print('@@@@@@@@@@@@@@@@@@@@@@@@@@@               @@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
      setState(() {
        isLoading = false;
      });

      Fluttertoast.showToast(msg: "Update success");
    }).catchError((err) {
      setState(() {
        isLoading = false;
      });

      Fluttertoast.showToast(msg: err.toString());
    });
  }

, это gist файла дротика.Я предполагаю, что не редактируя поля и затем нажимая кнопку обновления, функция обновления берет пустую строку для обновления и записывает ее в Firestore.Как мне предотвратить это?

1 Ответ

1 голос
/ 25 апреля 2019

Если вы скажете Firestore установить поле на пустую строку, оно установит это поле на пустую строку. Если вы не хотите, чтобы Firestore изменял поле, вы не должны указывать это поле в вызове updateDate(...).

На практике это означает, что вам необходимо условно заполнить Map значений примерно так:

Map<String, dynamic> values = new Map<String,dynamic>();
if (name?.isEmpty ?? true) values["name"] = name;
if (email?.isEmpty ?? true) values["email"] = email;
if (avatarUrl?.isEmpty ?? true) values["avatarUrl"] = avatarUrl;

AuthProvider.of(context).userData.docRef.updateData(values).then((data) async{
  ...

Логика проверки на наличие пустых строк приведена в Проверка дротика на ноль / ложь / пустота: как записать это короче?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...