繁体   English   中英

Firestore 如何在 Flutter 中获取具有特定用户 ID 的特定数据

[英]Firestore how to fetch specific data with specific user id in Flutter

我有 stream 生成器,我获取了所有用户。 之后,使用 bloc(或任何 state 管理)过滤它们。 过滤后,我创建了一个已过滤用户 ID 的集合(我的意思是有一个集合,它有用户 ID)。

现在,使用这些 uid,我想获取过滤后的用户数据。 我用FirebaseFirestore.instance.collection(...).doc(userId).get()做了,之后它给出了Future<String?> 我应该怎么办?

这是代码:

class HomePageBody extends StatelessWidget {
  HomePageBody({
    Key? key,
    required this.mapsState,
  }) : super(key: key);

  final MapsState mapsState;

  final Set users = {};
  @override
  Widget build(BuildContext context) {

    return StreamBuilder<QuerySnapshot>(
      stream: firestoreStream,
      builder: (context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting || snapshot.connectionState == ConnectionState.none) {
          return const CustomProgressIndicator(
            progressIndicatorColor: blackColor,
          );
        } else if (!snapshot.hasData) {
          return const CustomProgressIndicator(
            progressIndicatorColor: blackColor,
          );
        } else if (snapshot.hasData) {
          final usersDatas = snapshot.data.docs;

          for (var userDatas in usersDatas) {
            if (userDatas["latitude"] == null || userDatas["longitude"] == null) {
            } else {
              users.add(userDatas);
            }
          }
          context.read<MapsCubit>().filterUsersWithRespectToDistance(users: users);
          final usersWithInTenKilometers = mapsState.usersWithInTenKilometers;

          **// HERE WE HAVE FILTERED USERS, AND THIS SET HAS USER IDS.**

          return ListView.builder(
                  padding: const EdgeInsets.only(top: 75),
                  itemCount: usersWithInTenKilometers.length,
                  itemBuilder: (context, index) {
                    final userId = usersWithInTenKilometers.elementAt(index);
                    final usersDatas = FirebaseFirestore.instance
                        .collection("users")
                        .doc(userId)
                        .get();
                        // I did like this, but it does not work.

                    return CustomListTile(
                      userImageUrl: "https://picsum.photos/200/300",
                      userStatus: "userStatus",
                      userName: "userName",
                    );
                  },
                );
        }
        return const CustomProgressIndicator(
          progressIndicatorColor: blackColor,
        );
      },
    );
  }
}

因此,我有一个 Set(或者您可以像 List 一样思考),并且它有用户 ID。 使用这些用户 ID,基本上从 Firestore 获取用户数据(电子邮件:...,密码:...等)

  final userId = usersWithInTenKilometers.elementAt(index);
                    final users = FirebaseFirestore.instance
                        .collection("users")
                        .doc(userId)
                        .get()
                        .then((value) => value)
                        .then((value) => value.data());

                    return FutureBuilder(
                      future: users,
                      builder: (context, snapshot) {
                        if (snapshot.hasData) {
                          final convertUserDataToMap =
                              Map<String, dynamic>.from(snapshot.data as Map<dynamic, dynamic>);
                          final List userDataList = convertUserDataToMap.values.toList();
                          final userId = userDataList[0];
                          final userLong = userDataList[1];

....

我这样解决

由于您返回Future<String?> ,我通常会首先考虑使用FutureBuilder来呈现该值。

如果您有多个值,每个值都是单独异步加载的(就像您多次调用get()时的情况),我将从为每个Future使用单独的FutureBuilder开始。 只有当我遇到实际问题时,我才会开始考虑更复杂的选项,例如Future.wait()以等待所有选项完成后再呈现任何结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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