firebase - 更新 cloud firestore : The operator '[]' isn't defined for the type 'Object' . 后尝试定义操作符 '[]'

标签 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
      
    });
  }

最佳答案

起始于 cloud_firestore版本 2.0.0
类(class)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>您可以像往常一样使用 [] 访问数据运算符(operator)。

另一个例子:
Query query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();
以上将给出错误:

A value of type 'Stream<QuerySnapshot<Object?>>' can't be assigned to a variable of type 'Stream<QuerySnapshot<Map<String, dynamic>>>'.


您收到此错误是因为 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 :

BREAKING REFACTOR: DocumentReference, CollectionReference, Query, DocumentSnapshot, CollectionSnapshot, QuerySnapshot, QueryDocumentSnapshot, Transaction.get, Transaction.set and WriteBatch.set now take an extra generic parameter. (#6015).


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

关于firebase - 更新 cloud firestore : The operator '[]' isn't defined for the type 'Object' . 后尝试定义操作符 '[]',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67610111/

相关文章:

Firebase - 每个客户端的子域

flutter - 在 Flutter 中使 DataTable 双向滚动

flutter - 启用捏合和放大webview_flutter,在此处添加代码段[this.webView.getSettings()。setBuiltInZoomControls(true);]

Flutter:如何在 ListView.builder 中显示来自 ListView.builder 的数组数据?

javascript - ER_ACCESS_DENIED_ERROR CloudSQL

javascript - Firebase:数据库引用 'on' 方法未运行回调 (javascript)

java - 如何在 firebase 中检索兄弟节点的值?

flutter - 如何使用 flutter_flux 从 Store 更改 TextField 文本?

flutter - 没有IgnorePointer的列表菜单滚动

flutter - flutter ,箭在哪里?