Как сохранить данные Firestore в общих настройках, оператор ‘[]’ не определен для типа ‘DocumentSnapshot’

#flutter #google-cloud-firestore

#flutter #google-cloud-firestore

Вопрос:

Я новичок в flutter, я получаю ошибку при сохранении данных firestore в локальном хранилище с помощью общих настроек, я изо всех сил старался решить эту ошибку, но не нашел никакого решения, пожалуйста, заранее спасибо за помощь, я получаю ошибку в том, что другая часть кодового имени ошибки — оператор ‘[]’ не определен для типа ‘DocumentSnapshot’

  GoogleSignInAccount googleUser = await googleSignIn.signIn();
  GoogleSignInAuthentication googleAuth = await googleUser.authentication;

final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);

FirebaseUser firebaseUser = (await firebaseAuth.signInWithCredential(credential)).user;

if (firebaseUser != null) {
  // Check is already sign up
  final QuerySnapshot result =
  await Firestore.instance.collection('users').where('id', isEqualTo:
  firebaseUser.uid).get();
  final List<DocumentSnapshot> documents = result.docs;
  if (documents.length == 0) {
    // Update data to server if new user
    Firestore.instance.collection('users').document(firebaseUser.uid).setData({
      'name': firebaseUser.displayName,
      'photoUrl': firebaseUser.photoURL,
      'id': firebaseUser.uid,
      'createdAt': DateTime.now().millisecondsSinceEpoch.toString(),
      'chattingWith': null
    });

    // Write data to local
    currentUser = firebaseUser;
    await prefs.setString('id', currentUser.uid);
    await prefs.setString('nickname', currentUser.displayName);
    await prefs.setString('photoUrl', currentUser.photoUrl);
  } else {
    // Write data to local

    await prefs.setString('id', documents[0]['id']);
    await prefs.setString('nickname', documents[0]['nickname']);
    await prefs.setString('photoUrl', documents[0]['photoUrl']);
    await prefs.setString('aboutMe', documents[0]['aboutMe']);
  }
  

Ответ №1:

Вам нужно перебирать документы, чтобы сохранить данные каждого документа, и вам нужно использовать document.данные :

 GoogleSignInAccount googleUser = await googleSignIn.signIn();
  GoogleSignInAuthentication googleAuth = await googleUser.authentication;

final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);

FirebaseUser firebaseUser = (await firebaseAuth.signInWithCredential(credential)).user;

if (firebaseUser != null) {
  // Check is already sign up
  final QuerySnapshot result =
  await Firestore.instance.collection('users').where('id', isEqualTo:
  firebaseUser.uid).get();
  final List<DocumentSnapshot> documents = result.docs;
  if (documents.length == 0) {
    // Update data to server if new user
    Firestore.instance.collection('users').document(firebaseUser.uid).setData({
      'name': firebaseUser.displayName,
      'photoUrl': firebaseUser.photoURL,
      'id': firebaseUser.uid,
      'createdAt': DateTime.now().millisecondsSinceEpoch.toString(),
      'chattingWith': null
    });

    // Write data to local
    currentUser = firebaseUser;
    await prefs.setString('id', currentUser.uid);
    await prefs.setString('nickname', currentUser.displayName);
    await prefs.setString('photoUrl', currentUser.photoUrl);
  } else {
    // Write data to local
    documents.forEach((DocumentSnapshot document){
      Map<String,dynamic> documentData = document.data();
      await prefs.setString('id', documentData['id']);
      await prefs.setString('nickname', documentData['nickname']);
      await prefs.setString('photoUrl', documentData['photoUrl']);
      await prefs.setString('aboutMe', documentData['aboutMe']);
    });
    
  }