Firebase Firestore 错误:未为“对象”类定义运算符“[]”

Posted

技术标签:

【中文标题】Firebase Firestore 错误:未为“对象”类定义运算符“[]”【英文标题】:Firebase Firestore Error: The operator '[]' isn't defined for the class 'Object' 【发布时间】:2021-07-30 11:21:53 【问题描述】:

我正在学习如何通过此视频将 Flutter 应用连接到 Firebase

https://youtu.be/ggYTQn4WVuw

对我来说一切都完全一样,但在 android Studio 中出现了错误。

错误:没有为“对象”类型定义运算符“[]”。 (undefined_operator at [firebase_test] lib\services\database.dart:24)

出错的代码:

List<Brew> _brewListFromSnapshot(QuerySnapshot snapshot) 
return snapshot.docs.map((doc) 
  return Brew(
    name: doc.data()['name'] ?? '',
    strength: doc.data()['strength'] ?? 0,
    sugars: doc.data()['sugars'] ?? '0',
  );
).toList();

酿造班:

class Brew 
  final String name;
  final String sugars;
  final int strength;

  Brew( this.name, this.sugars, this.strength );

有人可以帮我解决这个问题吗?这是 Android Studio 的问题吗?

【问题讨论】:

查看***.com/a/67610936/7015400 【参考方案1】:

您使用的是最新的 Firestore 依赖项,版本 2.0.0,该版本于 2021 年 5 月 4 日发布。有重大变化,请阅读它们here。

“Add withConverter”,来自文档:

将 withConverter 函数添加到 CollectionReference、DocumentReference 和 Query (#6015)。这种新方法允许以类型安全的方式与集合/文档进行交互:

final modelsRef = FirebaseFirestore
     .instance
     .collection('models')
     .withConverter<Model>(
       fromFirestore: (snapshot, _) => Model.fromJson(snapshot.data()!),
       toFirestore: (model, _) => model.toJson(),
     );

 Future<void> main() async 
   // Writes now take a Model as parameter instead of a Map
   await modelsRef.add(Model());
   final Model model = await modelsRef.doc('123').get().then((s) => s.data());
 

或者,您可以简单地使用:

String name = snapshot.data.get('name');
//instead of 
String name = (snapshot.data.data() as Map<String,dynamic>)['name']

如果你想要整张地图:

Map<String,dynamic> data = snapshot.data.data() as Map<String,dynamic>);
String name = data['name'] ?? '';

【讨论】:

嗨!升级依赖项后遇到同样的问题。我不明白如何阅读您链接到的更改日志!...“FIX:文档中的 withConverter 示例 (#6438)”中的数字是什么意思?例如,#6438 代表什么?有什么地方可以得到更详细的解释...? 我编辑了我的答案@karolina,现在检查它是否有效 我已经意识到我可以将整个文档放在Map&lt;String, dynamic&gt; 中,因为我注意到我已经在代码的其他地方这样做了,而且这些位并没有崩溃!...但是我的问题是关于更改日志的!如果我能得到更详细的信息,而不是来自 ***?我找到了一些官方信息,但它似乎并不准确......等等,我会告诉你。 这里:firebase.google.com/docs/reference/android/com/google/firebase/… 似乎是说如果该字段不存在,.get() 将返回null。它还说我可以使用.contains() 测试它是否存在。但是当我尝试它时,contains() 不存在,.get() 不返回null,它使应用程序崩溃!!... ? 我在哪里可以找到有关此版本包的准确信息? 【参考方案2】:

使用这个:

doc.get('name') ?? '', 

代替:

doc.data()['name'] ?? '',

【讨论】:

如果 'name' 不存在,这将不起作用。它不会回退到 '',因为 StateError(错误状态:DocumentSnapshotPlatform 中不存在字段)【参考方案3】:

第一个解决方案:

您的 Brew 课程:

class Brew 
  final String name;
  final String sugars;
  final int strength;

  Brew( this.name, this.sugars, this.strength );
  
  Brew.fromJson(Map<String, dynamic> json)
      : this(
          name: json['name'] as String,
          sugars: json['sugars'] as String,
          strength: json['strength'] as int,
        );

  Map<String, Object?> toJson() 
    return 
      'name': name,
      'sugars': sugars,
      'strength': strength,
    ;
  

您的服务:

List<Brew> _brewListCollectionReference (CollectionReference<Map<String, dynamic>> collectionReference) 
  QuerySnapshot<Object?> snapshot = await collectionReference.withConverter<Brew>(
          fromFirestore: (snapshots, _ ) => Recipe.fromJson(snapshots.data()!),
          toFirestore: (brew, _ ) => brew.toJson(),
        ).get();
  return snapshot.docs.map((doc) => doc.data() as Brew).toList();

注意:您的 "collectionReference" 是您的 firebase 集合的引用。

例如: firestore.collection('brewCollection')

第二种解决方案:

List<Brew> _brewListFromSnapshot(QuerySnapshot snapshot) 
return snapshot.docs.map((doc) 
  return Brew(
    name: doc['name'] ?? '',
    strength: doc['strength'] ?? 0,
    sugars: doc['sugars'] ?? '0',
  );
).toList();

第三种解决方案:

List<Brew> _brewListFromSnapshot(QuerySnapshot snapshot) 
return snapshot.docs.map((doc) 
  return Brew(
    name: doc.get('name') ?? '',
    strength: doc.get('strength') ?? 0,
    sugars: doc.get('sugars') ?? '0',
  );
).toList();

【讨论】:

以上是关于Firebase Firestore 错误:未为“对象”类定义运算符“[]”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

未为调试版本生成 Firebase 消息令牌

未为 Firebase 云功能启用 Cors

React Native重复超时将集合写入firestore@firebase/firestore:Firestore(8.4.2):连接WebChannel传输错误

检索数据时出现 Vue/Firestore/Firebase 错误