如何不在网格视图中显示当前用户?

时间:2020-06-28 06:36:33

标签: flutter google-cloud-firestore firebase-authentication

我有一个名为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;
      });
    });
  }

1 个答案:

答案 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 的列表,而不是User对象的列表。

return snapshots.map((snapshot) {
           final result = snapshot.documents
                 .map((snapshot) => snapshot.data
                 .where((user) => user['id'] != currentUser.id)
                 .toList();
                 
           return result;