Flutter Firebase несколько потоков setData отвечает только на последний поток - PullRequest
1 голос
/ 16 июня 2020

При использовании нескольких потоков setData для записи в базу данных Firebase разрешается только последний поток. Например:

Future registerWithEmailAndPassword(String email, String password) async {
    try {
      AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      FirebaseUser user = result.user;
      await Firestore.instance.collection('stores').document(user.uid).setData({'String1': 'My First String', 'String2': 'My Second String', 'String3': 'My Third String'});
      await Firestore.instance.collection('stores').document(user.uid).setData({'String4': 'My Fourth String', 'String5': 'My Fifth String', 'String6': 'My Sixth String'});
      return userFromFirebaseUser(user);

    } catch(e) {
      print('REGISTER EnP ERROR: ' + e.toString());
      return null;
    }
  }

Результаты в базе данных Firebase, показывающие следующее, когда я создаю нового пользователя:

String4: "My Fourth String"
String5: "My Fifth String"
String6: "My Sixth String"

Потребуется возможность записи в базу данных таким образом, каждая запись должна «ждать» завершения, прежде чем двигаться дальше, но это не похоже на то, что происходит.

(EDIT) Для barbecu:

Фактический код состоит в том, что вместо записи напрямую с помощью setData I передавать данные через классы. Так что вместо:

await Firestore.instance.collection('stores').document(user.uid).setData({'String1': 'My First String', 'String2': 'My Second String', 'String3': 'My Third String'});
await Firestore.instance.collection('stores').document(user.uid).setData({'String4': 'My Fourth String', 'String5': 'My Fifth String', 'String6': 'My Sixth String'});

это фактически написано как:

await DatabaseService1(uid: user.uid).updateUserData(variable1, variable2, variable3);
await DatabaseService2(uid: user.uid).updateUserData(variable4, variable5, variable6);

Итак, когда дело доходит до решения пакетного типа, я не совсем уверен, как написать синтаксис того, как чтобы вызвать эти классы в пакет, а затем запустить его.

1 Ответ

4 голосов
/ 17 июня 2020

Попробуйте следующее:

 await Firestore.instance.collection('stores').document(user.uid).setData({'String1': 'My First String', 'String2': 'My Second String', 'String3': 'My Third String'});
 await Firestore.instance.collection('stores').document(user.uid).updateData({'String4': 'My Fourth String', 'String5': 'My Fifth String', 'String6': 'My Sixth String'});

Используйте setData() для первой записи, чтобы добавить данные, а во второй записи используйте updateData(), чтобы добавить новые поля, в настоящее время второе setData() переопределяет поля в первом setData(), поэтому вы не видите String1, String2, String3 в базе данных.

...