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<String, dynamic>
中,因为我注意到我已经在代码的其他地方这样做了,而且这些位并没有崩溃!...但是我的问题是关于更改日志的!如果我能得到更详细的信息,而不是来自 ***?我找到了一些官方信息,但它似乎并不准确......等等,我会告诉你。
这里: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?”定义运算符“[]”。 - “对象”来自“飞镖:核心”
React Native重复超时将集合写入firestore@firebase/firestore:Firestore(8.4.2):连接WebChannel传输错误