【问题标题】:How to NOT show the current user in a Grid View?如何不在网格视图中显示当前用户?
【发布时间】:2020-10-18 11:47:55
【问题描述】:

我有一个名为getAllUsers() 的函数,它返回数据库中的所有用户。问题是我希望 GridView.builder() 显示除当前用户之外的所有用户,但尽管我做了所有研究,但似乎没有任何结果。

如果我在itemBuilder: 中使用if(snapshot.data.documents[i].data["username"] != currentUserId 之类的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;
      });
    });
  }

【问题讨论】:

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


    【解决方案1】:

    也许你可以尝试这样的事情。你过滤查询结果:

     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; 
    

    【讨论】:

    • User.fromMap() 是做什么的?将映射更改为用户类型?
    • 这是一个工厂构造函数,将数据从快照转换为用户对象。你没有 User 类?
    • 我没有用户模型
    • 我将编辑获取原始数据的方法,但作为一个好习惯,您应该创建一个 User 类。
    • 是的。你有什么错误?你能说明你是如何添加方法的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多