[英]how to where query a collectionGroup in firestore flutter?
[英]how to retrive value from a firestore flutter where query
我最近启动了 flutter,我尝试从使用“where”进行的查询中检索数据,但我唯一得到的是“Instance of '_JsonQueryDocumentSnapshot'”。 我尝试了不同的东西,但没有任何效果,或者我做得很糟糕这是我的代码:
CollectionReference users =
FirebaseFirestore.instance.collection('users');
final documents =
await users.where("username", isEqualTo: "username").get();
documents.docs.forEach((element) {
print(element);
});
我也尝试过使用 Future 但没有成功:
class finduser extends StatelessWidget {
final String username;
finduser(this.username);
@override
Widget build(BuildContext context) {
CollectionReference users = FirebaseFirestore.instance.collection('users');
return FutureBuilder(
future: users.where('username', isEqualTo: '${username}').get(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasError) {
print("wrong");
return Text("Something went wrong");
}
if (snapshot.hasData && !snapshot.data!.exists) {
print("doesnt exist");
return Text("User does not exist");
}
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data = snapshot.data! as Map<String, dynamic>;
print(snapshot.data!);
return Text("${data}");
}
return Text("loading");
},
);
}
}
目前,所有用户名都只是“用户名”
感谢您的帮助
当你得到这样的文件时:
CollectionReference users =
FirebaseFirestore.instance.collection('users');
final documents =
await users.where("username", isEqualTo: "username").get();
documents.docs.forEach((element) {
print(element);
});
您正在尝试打印QueryDocumentSnapshot
的实例
这个QueryDocumentSnapshot
有一个方法.data()
返回一个Map<String,dynamic>
aka JSON
。
因此,为了打印文档的内容,请执行以下操作:
documents.docs.forEach((element) {
print(MyClass.fromJson(element.data()));
});
这些数据本身不会很有用,所以我建议为您的 class 创建一个工厂方法:
class MyClass {
final String username;
const MyClass({required this.username});
factory MyClass.fromJson(Map<String, dynamic> json) =>
MyClass(username: json['username'] as String);
}
现在你可以调用MyClass.fromJson(element.data());
并通过这种方式获取 class 的新实例。
我搜索了很多,但我看到你写的代码是对的。
我唯一想到的是你没有将你的 firebase 初始化为你的 flutter 项目(你应该在任何 flutter 项目中这样做才能使用 flutter)。
文档链接: https://firebase.flutter.dev/docs/overview#initializing-flutterfire
在您的第一个代码片段中,您正在打印element
,它们是QueryDocumentSnapshot
class 的实例。由于您没有访问文档快照的特定数据,您将获得其默认的toString
实现,它显然只显示 class 名称。
更有意义的是打印文档 ID:
documents.docs.forEach((doc) {
print(doc.id);
});
或文档中的字段,例如用户名:
documents.docs.forEach((doc) {
print(doc.get("username"));
});
运行此代码,它将起作用。
我也遇到过类似的问题,所以我使用了这个解决方法。
Map<String, dynamic> data = {};
FirebaseFirestore.instance.collection('users').where("username", isEqualTo: "username").get().then((QuerySnapshot querySnapshot) {
querySnapshot.docs.forEach((value){
data = value.data()!;
print('printing uid ${data['uid']}');
print('printing username--${data['username']}');
print('printing all data--$data');
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.