【问题标题】:The argument type Future<bool> cannot be assigned to the parameter type 'bool'参数类型 Future<bool> 不能分配给参数类型“bool”
【发布时间】:2020-08-23 08:22:02
【问题描述】:

您好,我正在尝试创建一个可见性小部件,用于显示用户是否在 Firebase 数据库阵列上。看起来像这样(成员数组):

如你所见,我创建了一个 StreamBuilder,如果当前用户的用户名在这个数组上,它应该返回 Visibility 小部件:

StreamBuilder<QuerySnapshot>(
          stream: _firestore.collection('chats').snapshots(),
          builder: (context, snapshot){
            if(!snapshot.hasData){

            }else {
              final chats = snapshot.data.documents;
              List<ChatCard> chatCards = [];
              for (var chat in chats) {
                final String nameOfChat = chat.data['name'];
                final String lastMessageSent = chat.data['lastMessageSent'];
                final List members = chat.data['members'];

                final ChatCard chatCard = ChatCard(
                  nameOfChat: nameOfChat ?? '',
                  lastMessageSent: lastMessageSent ?? '',
                );

                chatCards.add(chatCard);
              }
              return Visibility(
                visible: checkIfOnAnyChats(),
                child: Expanded(
                  child: ListView(
                    children: chatCards,
                  ),
                ),

              );
            }
          }
        ),

这就是“checkIfOnAnyChats()”未来的样子:

  Future<bool> checkIfOnAnyChats() async {
    FirebaseUser user = await _auth.currentUser();

    final QuerySnapshot result = await _firestore
        .collection('chats')
        .where('members', arrayContains: _username)
        .getDocuments();
    final List<DocumentSnapshot> documents = result.documents;

    if(documents.length > 0) {
      setState(() {
        return true;
      });
    }else{
      setState(() {
        return false;
      });
    }
  }

我正在尝试将此值分配给“可见”布尔值,但它不起作用,因为它是 未来布尔值,而不是普通布尔值。

有什么建议吗?

谢谢。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    如果你想使用从Future返回的bool,你需要使用FutureBuilder;

    StreamBuilder<QuerySnapshot>(
      stream: _firestore.collection('chats').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
        } else {
          final chats = snapshot.data.documents;
          List<ChatCard> chatCards = [];
          for (var chat in chats) {
            final String nameOfChat = chat.data['name'];
            final String lastMessageSent = chat.data['lastMessageSent'];
            final List members = chat.data['members'];
    
            final ChatCard chatCard = ChatCard(
              nameOfChat: nameOfChat ?? '',
              lastMessageSent: lastMessageSent ?? '',
            );
    
            chatCards.add(chatCard);
          }
          return FutureBuilder<bool>(
            future: checkIfOnAnyChats(),
            builder: (context, fSnapshot) {
              if (fSnapshot.hasData)
                return Visibility(
                  visible: fSnapshot.data,
                  child: Expanded(
                    child: ListView(
                      children: chatCards,
                    ),
                  ),
                );
              return Center(child: CircularProgressIndicator());
            },
          );
        }
      },
    ),
    

    而且你不需要在 Future 函数中使用 setState;

    Future<bool> checkIfOnAnyChats() async {
      FirebaseUser user = await _auth.currentUser();
    
      final QuerySnapshot result = await _firestore
          .collection('chats')
          .where('members', arrayContains: _username)
          .getDocuments();
      final List<DocumentSnapshot> documents = result.documents;
    
      return documents.length > 0;
    }
    

    【讨论】:

    • 谢谢,但即使用户不在成员数组中,它仍会显示 ChatCard 小部件
    猜你喜欢
    • 2021-04-07
    • 2021-10-16
    • 2021-10-10
    • 2021-11-24
    • 2021-07-06
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多