Flutter Firestore устанавливает данные перед загрузкой страницы

#flutter #google-cloud-firestore

#flutter #google-облако-firestore

Вопрос:

Я пытаюсь добавить свои данные в текстовое поле формы, которое затем сохраняется в firestore, включая documentId. По какой-то причине данные возвращаются как null или «». Ниже приведен мой код:

   final barcode = TextEditingController();
  final price = TextEditingController();
  final stock = TextEditingController();
  final color = TextEditingController();
  addData() {
    Map<String, dynamic> theData = {
      "Color" : color.text,
      "Price" : price.text,
      "Stock" : stock.text,
    };
    CollectionReference collectionReference = Firestore.instance.collection("products");
    FirebaseFirestore.instance.collection("products").doc(barcode.text).set(theData);
    collectionReference.add(theData);

  }
  

Я пытался сделать его асинхронным, но все равно ничего, я хочу, чтобы данные устанавливались при нажатии кнопки «Готово», которая имеет метод onpressed, вызывающий addData.

Это мои данные в firestore, когда я устанавливаю только данные, а не идентификатор: введите описание изображения здесь

Комментарии:

1. Можете ли вы поделиться кодом, в котором вы вызываете метод addData() ?

Ответ №1:

Вы должны использовать await

     addData() async { // ASYNC HERE
    Map<String, dynamic> theData = {
      "Color" : color.text,
      "Price" : price.text,
      "Stock" : stock.text,
    };
    CollectionReference collectionReference = Firestore.instance.collection("products");
    await collectionReference.doc(barcode.text).set(theData, merge:true); // AWAIT HERE
  

или

 CollectionReference collectionReference = Firestore.instance.collection("products");
        await collectionReference.doc(barcode.text).updateData(theData); // AWAIT HERE
  }
  

Также не уверен, почему вы оба устанавливаете и добавляете данные? Используйте updateData() или set() с merge:true помощью . Документ будет создан в любом случае

Комментарии:

1. Я получаю следующую ошибку, может быть, мне нужно отложить ее на будущее? : Ожидалось значение типа ‘(() => void)?’, но получил значение типа ‘ Future<dynamic>’