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