我有一个名为getAllUsers()
的函数,该函数从数据库返回所有用户。问题是我希望GridView.builder()
显示除当前用户外的所有用户,但是尽管我做了所有的研究,但似乎无济于事。
如果我在if(snapshot.data.documents[i].data["username"] != currentUserId
中使用itemBuilder:
之类的if条件,它将返回代表当前用户的空白图块,该图块在网格视图中创建了间隙。因此,它使网格视图看起来真的很糟糕。
我相信,如果我知道如何在getAllUsers()
方法中包含不平等查询,就可以解决此问题。但是我的理解是Firestore尚未提供此功能/参数。
HomeFragment类
Database _database = Database();
Stream _stream;
String currentUserId;
@override
void initState() {
getCurrentUserId();
getAllUsers();
super.initState();
}
getAllUsers() async {
return await _database.getAllUsers().then((val) {
if (mounted)
setState(() => _stream = val);
});
}
getCurrentUserId() async {
FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();
currentUserId = currentUser.uid;
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _stream,
builder: (context, snapshot) {
return snapshot.data == null ? Center(child: CircularProgressIndicator())
: Container(
padding: EdgeInsets.symmetric(horizontal: 20.0),
child:
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 8.0,
mainAxisSpacing: 8.0,
),
itemCount: snapshot.data.documents.length,
itemBuilder: (context, i) {
return Container(
child: Text(snapshot.data.documents[i].data["username"])
);
}
// etc etc..
数据库类
getAllUsers() async {
return await _firestore.collection("users").snapshots();
}
我尝试使用它,但是_stream2
返回null
Stream _stream, _stream2;
getAllUsers() async {
return await _database.getAllUsers().then((val) {
if (mounted) {
List<String> list;
setState(() {
_stream = val;
_stream2 = _stream.where((snapshot) {
_querySnapshot = snapshot;
for (int i = 0; i < _querySnapshot.documents.length; i++)
list.add(_querySnapshot.documents[i].data["userId"]);
return list.contains(currentUserId) == false;
});
});
}
});
}
我也尝试过,它不起作用
getAllUsers() async {
Stream<QuerySnapshot> snapshots = await _database.getAllUsers();
_stream = snapshots.map((snapshot) {
snapshot.documents.where((documentSnapshot) {
return documentSnapshot.data["userId"] != currentUserId;
});
});
}
答案 0 :(得分:2)
也许您可以尝试类似的方法。您过滤查询结果:
getAllUsers() async {
final Stream<QuerySnapshot> snapshots = await _firestore.collection("users").snapshots();
return snapshots.map((snapshot) {
final result = snapshot.documents
.map((snapshot) => User.fromMap(snapshot.data)
.where((user) => user.id != currentUser.id)
.toList();
return result;
}
}
如果没有User类,则可以用此类替换一些行。但是结果将是Map
return snapshots.map((snapshot) {
final result = snapshot.documents
.map((snapshot) => snapshot.data
.where((user) => user['id'] != currentUser.id)
.toList();
return result;