StreamBuilder всегда возвращает false при печати(snapshot.hasData) в flutter

# #flutter #dart #google-cloud-firestore #provider

Вопрос:

я буду показывать сообщение от firebase firestore в flutter , но когда я делаю условный снимок, всегда возвращающий false, это мой код

Обслуживание

 Stream<List<MessageModel>> getMessagesByUserid({int userId}) {
    try {
      return firestore
          .collection('messages')
          .where('userId', isEqualTo: userId)
          .snapshots()
          .map((QuerySnapshot list) {
        var result = list.docs.map<MessageModel>((DocumentSnapshot message) {
          print('from service : '   message.data().toString());
          return MessageModel.fromJson(message.data());
        }).toList();

        result.sort(
          (MessageModel a, MessageModel b) =>
              a.createdAt.compareTo(b.createdAt),
        );
        return resu<
      });
    } catch (e) {
      throw Exception(e);
    }
  }
 

и позвоните с этим

  Widget content() {
      return StreamBuilder<List<MessageModel>>(
          stream: MessageService()
              .getMessagesByUserid(userId: authprovider.user.id),
          builder: (context, snapshot) {
            print(snapshot.hasData);
            if (snapshot.hasData) {
              return ListView(
                padding: EdgeInsets.symmetric(
                  horizontal: defaultMargin,
                ),
                children: snapshot.data
                    .map(
                      (MessageModel message) => ChatBubble(
                        isSender: message.isFromUser,
                        text: message.message,
                        product: message.product,
                      ),
                    )
                    .toList(),
              );
            } else {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
          });
    }
 

когда я печатаю в сервисе , я получаю

 I/flutter (29881): from service : {createdAt: 2021-06-28 16:29:25.106709, product: {}, userImage: https://ui-avatars.com/api/?name=ekaamp;color=7F9CF5amp;background=EBF4FF, isFromUser: true, message: tanpa, userName: eka, userId: 2, updatedAt: 2021-06-28 16:29:25.106811}
 

но когда я печатаю(snapshot.hasData), всегда возвращаю false

 I/flutter (29881): false

 

Комментарии:

1. Изменение Stream на Future в Сервисах

2. Возможно, ваш код для getMessagesByUserid может выдавать и ошибаться….. Так что верните что-нибудь и в блоке catch, чтобы посмотреть

3. snapshot.connectionState' Скорее проверь, чем snapshot.hasData . Состояние соединения может быть ожидающим, нет, активным или выполненным, и hasData все еще false Stream может быть возвращено null

Ответ №1:

Если вам требуется большая детализация при использовании StreamBuilder , то лучше протестируйте snapshot.connectionState , а не snapshot.hasData .

snapshot.hasData все еще может быть ложным, если поток возвращает значение null