更新 cloud firestore 后:未为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

时间:2021-05-19 20:01:25

标签: firebase flutter dart google-cloud-firestore

一切正常,但是当我升级我的云 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
      
    });
  }

3 个答案:

答案 0 :(得分:8)

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>”类型的值不能分配给“Stream>>”类型的变量。

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

abstract class Query<T extends Object?>

snapshots() 返回以下内容:

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

由于没有为 Query 指定类型,并且因为 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();

根据docs

<块引用>

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

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

答案 1 :(得分:1)

就我而言,我只需将 snapshot.data()['parameter'] 更改为 snapshot.get('parameter')

UserModel _userFromFirebaseSnapshot(DocumentSnapshot snapshot) {
 return snapshot != null ?
    UserModel(snapshot.id,
      name: snapshot.get('name'),
      profileImageUrl: snapshot.get('profileImageUrl'),
      email: snapshot.get('email'),
    ) : null;
 }

答案 2 :(得分:0)

@Felipe Sales 的这个回答对我有用

final messageText = (docs.data() as dynamic)['message'];