Cloud Firestore 错误未为“对象”类型定义运算符“[]”。升级到 2.0.0 后?

Posted

技术标签:

【中文标题】Cloud Firestore 错误未为“对象”类型定义运算符“[]”。升级到 2.0.0 后?【英文标题】:Cloud Firestore error The operator '[]' isn't defined for the type 'Object'. after Upgrade to 2.0.0? 【发布时间】:2021-07-27 04:32:44 【问题描述】:

这不是旧的 doc.data['field'] 与 doc.data()['field'] 迁移问题......这是新的(对我来说):

以下代码是我的项目中的一个常见示例,在 Flutter with Firebase 的最后 8 个月内运行良好。我正在迁移到 null 安全性,并且在将我的依赖项升级到最新版本时,以下代码返回以下 IDE 错误:“未为类型 'Object' 定义运算符'[]'。”

  final CollectionReference openUserList = FirebaseFirestore.instance.collection('openUsers');

final newUser = await openUserList.doc(ownerEmail.toLowerCase()).get();
if (newUser.exists) 
  return UserEssential(
    uid: newUser.data()['uid'],
    email: newUser.data()['email'].toString().toLowerCase(),
    displayName: newUser.data()['displayName'],
    defaultFacility: newUser.data()['facility'] ?? '',
    phone: newUser.data()['phone'] ?? '',
  );
 else 
  return null;
 

当我调整到以下内容时,将 newUser 中的位置指定为 newUsers 列表,它会运行:

    uid: newUser[0].data()['uid'],
    email: newUser[0].data()['email'].toString().toLowerCase(),
    displayName: newUser[0].data()['displayName'],
    defaultFacility: newUser[0].data()['facility'] ?? '',
    phone: newUser[0].data()['phone'] ?? '',

进行更改后没有错误。我没有在 Flutter Fire 上看到或找到任何关于此的文档。 DocumentSnapshot 变成列表了吗?

这是否与 null 安全性、未记录的 firebase 更改以及 IDE 错误或其他问题有关?我的代码示例提取了一个 DocumentSnapshot,因此不能有多个新用户,为什么需要 [0],因为这与我的空安全迁移相吻合,它与许多其他事情一起发生。我担心这实际上是错误的,这是另外一回事,我在浪费时间。

顺便说一句:将 newUser 显式声明为 DocumentSnapshot 不会改变任何内容。

【问题讨论】:

【参考方案1】:

好的,在仔细阅读了 FlutterFire 文档和 2.0.0 迁移之后here:

解决方案就是像这样更明确地定义 CollectionReference:

  final CollectionReference<Map<String, dynamic>> openUserList = FirebaseFirestore.instance.collection('openUsers');

【讨论】:

并为查询快照等执行此操作,如您在链接中看到的那样。魔术。【参考方案2】:

一切都保持不变,但您必须将 &lt;Map&lt;String, dynamic&gt;&gt; 添加到任何云 Firestore 类中,例如,如果您的代码是这样的:

CollectionReference someCollection =
      FirebaseFirestore.instance.collection('someCollection');

您必须将其更改为:

CollectionReference<Map<String, dynamic>> someCollection =
      FirebaseFirestore.instance.collection('someCollection');

这同样适用于任何类,例如,如果您制作 QuerySnapshot 并且您的代码如下所示:

List<Something> _somethingListFromSnapshot(QuerySnapshot snapshot) 
    return snapshot.docs.map((doc) 
      return Something(
        something: doc.data()['something'] ?? '',
      );
    ).toList();
  

你必须把它改成这样:

List<Something> _somethingListFromSnapshot(QuerySnapshot<Map<String, dynamic>> snapshot) 
    return snapshot.docs.map((doc) 
      return Something(
        something: doc.data()['something'] ?? '',
      );
    ).toList();
  

如前所述,它适用于任何云 Firestore 类

【讨论】:

以上是关于Cloud Firestore 错误未为“对象”类型定义运算符“[]”。升级到 2.0.0 后?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firestore:未为类“Object?”定义运算符“[]”。 - “对象”来自“飞镖:核心”

未为类型“Object Function()”定义运算符“[]”

未为“对象”类型定义运算符“[]”[重复]

Flutter cloud_firestore 系统日期对象的设置/警告

使用 Flutter 向 Cloud Firestore 添加对象

添加“cloud_firestore”时出现颤振错误