zer*_*ill 4 dart firebase flutter google-cloud-firestore
一切都很好,但是当我升级我的云 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
});
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*dad 10
cloud_firestore2.0.0 版开始该类DocumentSnapshot现在采用一个泛型参数。声明:
abstract class DocumentSnapshot<T extends Object?> {
Run Code Online (Sandbox Code Playgroud)
因此它包含一个类型的抽象方法T:
T? data();
Run Code Online (Sandbox Code Playgroud)
因此,您需要执行以下操作:
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"],
});
Run Code Online (Sandbox Code Playgroud)
现在data()方法将是类型Map<String,dynamic>,您可以像通常使用[]运算符一样访问数据。
Query query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();
Run Code Online (Sandbox Code Playgroud)
以上将给出错误:
不能将“Stream<QuerySnapshot<Object?>>”类型的值分配给“Stream<QuerySnapshot<Map<String, dynamic>>>”类型的变量。
您收到此错误是因为Query具有以下声明:
abstract class Query<T extends Object?>
Run Code Online (Sandbox Code Playgroud)
whilesnapshots()返回以下内容:
Stream<QuerySnapshot<T>> snapshots({bool includeMetadataChanges = false});
Run Code Online (Sandbox Code Playgroud)
由于没有为Query和指定类型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();
Run Code Online (Sandbox Code Playgroud)
根据文档:
BREAKING REFACTOR:DocumentReference、CollectionReference、Query、DocumentSnapshot、CollectionSnapshot、QuerySnapshot、QueryDocumentSnapshot、Transaction.get、Transaction.set 和 WriteBatch.set 现在采用额外的通用参数。(#6015)。
因此,您需要为所有这些类实现上述内容。
就我而言,我只需要更改snapshot.data()['parameter']为snapshot.get('parameter')
UserModel _userFromFirebaseSnapshot(DocumentSnapshot snapshot) {
return snapshot != null ?
UserModel(snapshot.id,
name: snapshot.get('name'),
profileImageUrl: snapshot.get('profileImageUrl'),
email: snapshot.get('email'),
) : null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1144 次 |
| 最近记录: |