Después de actualizar Cloud Firestore: el operador '[]' no está definido para el tipo 'Objeto'. Intente definir el operador '[]'
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
});
}
A partir de cloud_firestore
la versión 2.0.0
La clase DocumentSnapshot
ahora 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 Query
tiene 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 Query
y 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.