Errore "L'operatore '[]' non è definito" quando si utilizza .data [] in flutter firestore

Aug 22 2020

Sto imparando a usare firestore in flutter seguendo il tutorial di Net Ninja su youtube. Dopo aver eseguito l'autenticazione dell'utente, questo ragazzo ha aggiunto i record degli utenti al database ogni volta che viene creato un nuovo utente, per fare ciò è stato aggiunto un nuovo modello passando 1 stringa denominata "nome" e da quello che ho capito per aver chiamato ha mappato il modello e quindi utilizzato .data ['nome'] per ottenere quella stringa dal modello (la stringa è stata chiamata nome) e durante questa operazione, ho ricevuto l'errore The operator '[]' isn't defined for the type 'Map<String, dynamic> Function()'Perché ricevo questo errore?

modello nome utente

class Username {
  final String name;
  Username({ this.name });
}

databse.dart file (il codice seguente è racchiuso in una classe chiamata DatabaseService)

  List<Username> _usernameListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc){
      return Username(
        name: doc.data['name'] ?? '',
      );
    }).toList();
  }

auth.dart

  Future registerWithEmailAndPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      User user = result.user;

      // create a new document for the user with uid
      await DatabaseService(uid: user.uid).updateUserData('user123');
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

se hai domande o hai bisogno di vedere altro codice, fammelo sapere nei commenti

Risposte

35 PeterHaddad Aug 22 2020 at 03:27

Cambia questo:

name: doc.data['name'] ?? '' 

In questo:

name: doc.data()['name'] ?? '' 

data()è un metodo ora quindi devi aggiungere (), dal codice sorgente:

  Map<String, dynamic> data() {
    return _CodecUtility.replaceDelegatesWithValueInMap(
        _delegate.data(), _firestore);
  }

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/document_snapshot.dart#L38

4 AnisR. Sep 03 2020 at 19:01

Firestore dataera una proprietà di QueryDocumentSnapshot, ma ora è una funzione data(),.

E, come suggerisce il messaggio di errore, ciò con cui hai a che fare è effettivamente a Map<String, dynamic> Function(), cioè una funzione che restituisce una mappa.

Quindi, aggiungi semplicemente parentesi vuote per chiamare la funzione data:

doc.data()['name']