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