繁体   English   中英

如何从 firestore flutter where 查询中检索值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM