firebase - 更新云 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开始
该类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)。
因此,您需要为所有这些类实现上述内容。
推荐阅读
- c - Visual Studio 打开文件夹 GCC (Cygwin) 智能感知错误
- python - 取消选中独占组中的所有框
- r - 使用 score 函数和提取向量的 envfit vegan 结果有什么区别?
- typescript - 在手机浏览器中上传仅打开相机的antd
- swift - 如何移动不变形的物体
- discord.py - 如何使机器人能够显示来自任何服务器的任何表情符号的链接
- gitlab - GitLab CI 使用标签工件进行发布而不被覆盖
- reactjs - 更新使用 cra-template-pwa 创建的 PWA
- ffmpeg - 如何在同一个 ffmpeg 命令中两次使用 concat demuxer
- scala - 使用 scala 和 spark 将 Stream Dataframe 转换为 Spark Dataframe