一切都很好,但是当我升级我的云 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/