簡體   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