首页 > 解决方案 > 更新云 Firestore 后:未为“对象”类型定义运算符“[]”。尝试定义运算符'[]'

问题描述

每件事都运行良好,但是当我升级我的云火库依赖时。我开始收到错误消息“未为类型'Object'定义运算符'[]'。”。这个错误出现在所有 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
      
    });
  }

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


cloud_firestore版本 2.0.0开始

该类DocumentSnapshot现在采用一个通用参数。声明:

abstract class DocumentSnapshot<T extends Object?> {

因此它包含一个类型的抽象方法T

  T? data();

因此,您需要执行以下操作:

    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"], 
      
    });

现在data()方法将是类型Map<String,dynamic>,您可以像往常一样使用[]运算符访问数据。


另一个例子:

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

以上将给出错误:

“Stream<QuerySnapshot<Object?>>”类型的值不能分配给“Stream<QuerySnapshot<Map<String, dynamic>>>”类型的变量。

您收到此错误是因为Query具有以下声明:

abstract class Query<T extends Object?>

whilesnapshots()返回以下内容:

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

Query由于没有为and since指定类型T extends Object?,因此在代码snapshots()中将具有以下返回类型Stream<QuerySnapshot<Object?>>,您将收到上述错误。所以要解决这个问题,你必须这样做:

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

根据文档

BREAKING REFACTOR:DocumentReference、CollectionReference、Query、DocumentSnapshot、CollectionSnapshot、QuerySnapshot、QueryDocumentSnapshot、Transaction.get、Transaction.set 和 WriteBatch.set 现在采用额外的通用参数。(#6015)。

因此,您需要为所有这些类实现上述内容。


推荐阅读