Тип аргумента Future <bool>не может быть назначен типу параметра 'bool' - PullRequest
0 голосов
/ 08 мая 2020

Привет, я пытаюсь создать виджет Visiblity, который отображается, если пользователь находится в массиве базы данных Firebase. Выглядит это так (массив членов): enter image description here

Как видите, я создал 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;
      });
    }
  }

Я пытаюсь присвоить это значение логическому значению «visible», но оно не работает потому что это Future bool , а не обычный bool.

Есть предложения?

Спасибо.

1 Ответ

1 голос
/ 08 мая 2020

Если вы хотите использовать bool, возвращенный из Future, вам нужно использовать 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());
        },
      );
    }
  },
),

, и вам не нужно использовать setState внутри функций Future;

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;
}
...