Después de actualizar Cloud Firestore: el operador '[]' no está definido para el tipo 'Objeto'. Intente definir el operador '[]'

Resuelto zerochill asked hace 54 años • 2 respuestas

Todo funcionaba bien, pero cuando actualicé mi dependencia de Cloud Firestore. Comencé a recibir el error "El operador '[]' no está definido para el tipo 'Objeto'". Este error aparece delante de los 4 userData.data()[""],

class BaseProvider with ChangeNotifier {
  //instances of firebase

  final FirebaseAuth _auth = FirebaseAuth.instance;

  final CollectionReference postsCollection =
      FirebaseFirestore.instance.collection("posts");

  final CollectionReference userCollection =
      FirebaseFirestore.instance.collection("users");

  //Creating post

  Future addPost(
    
  ) async {
    DocumentSnapshot userData =
        await userCollection.doc(_auth.currentUser.uid).get();
    return await postsCollection.doc().set({
      "id": _auth.currentUser.uid,
      "sellername": userData.data()["name"],      //Error
      "sellercontact": userData.data()["phone"],  //Error
      "sellercity": userData.data()["city"],      //Error
      "sellerstate": userData.data()["state"],    //Error
      
    });
  }
zerochill avatar Jan 01 '70 08:01 zerochill
Aceptado

A partir de cloud_firestorela versión 2.0.0

La clase DocumentSnapshotahora toma un parámetro genérico. La declaracion:

abstract class DocumentSnapshot<T extends Object?> {

y por lo tanto contiene un método abstracto de tipo T:

  T? data();

Por lo tanto necesitas hacer lo siguiente:

    DocumentSnapshot<Map<String, dynamic>> userData =
        await userCollection.doc(_auth.currentUser.uid).get();
    return await postsCollection.doc().set({
      "id": _auth.currentUser.uid,
      "sellername": userData.data()["name"],      
      "sellercontact": userData.data()["phone"],  
      "sellercity": userData.data()["city"],      
      "sellerstate": userData.data()["state"], 
      
    });

Ahora data()el método será de tipo Map<String,dynamic>y podrás acceder a los datos como lo haces normalmente usando el []operador.


Otro ejemplo:

Query query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();

Lo anterior dará el error:

Un valor de tipo 'Stream<QuerySnapshot<Object?>>' no se puede asignar a una variable de tipo 'Stream<QuerySnapshot<Map<String,dynamic>>>'.

Obtienes este error porque Querytiene la siguiente declaración:

abstract class Query<T extends Object?>

mientras snapshots()devuelve lo siguiente:

Stream<QuerySnapshot<T>> snapshots({bool includeMetadataChanges = false});

Dado que no se especificó un tipo para Queryy desde T extends Object?, en el código snapshots()tendrá el siguiente tipo de retorno Stream<QuerySnapshot<Object?>>y obtendrá el error anterior. Entonces para solucionar esto tienes que hacer:

Query<Map<String,dynamic>> query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();

Según los documentos :

REFACTOR DE ÚLTIMA HORA: DocumentReference, CollectionReference, Query, DocumentSnapshot, CollectionSnapshot, QuerySnapshot, QueryDocumentSnapshot, Transaction.get, Transaction.set y WriteBatch.set ahora toman un parámetro genérico adicional. (#6015).

Por lo tanto, es necesario implementar lo anterior para todas esas clases.

Peter Haddad avatar May 19 '2021 21:05 Peter Haddad