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

Cloud Firestore error The operator '[]' isn't defined for the type 'Object'. after Upgrade to 2.0.0?

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

下面的代码是我项目中的一个常见示例运行在 Flutter with Firebase 中的最后 8 mo 没问题。我正在迁移到空安全,并且在将我的依赖项升级到最新版本时,以下代码返回以下 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 变成列表了吗?

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

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

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

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

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

一切都保持不变,但您必须将 <Map<String, dynamic>> 添加到任何云 Firestore class,例如,如果您的代码是这样的:

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

您必须将其更改为:

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

这同样适用于任何 class,例如,如果您制作了一个 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 class