Флаттер: получить снимок документа - PullRequest
0 голосов
/ 18 октября 2018

Я создал построитель Listview, передав buildChatList в качестве моего itembuilder, но я заметил, что ничего не возвращается из buildChatList, когда я HOT RESTART или Rebuild приложения, НО фактически вернул ожидаемые данные, когда я HOT RELOAD.Я не понимаю, почему это происходит.Мне нужна помощь.

Ниже приведен мой код.

buildChatList(BuildContext context, int index) {
    Map<String, dynamic> userDocumentt;
    print('INDEX $index COUNT $currentUserActiveChatsLength');
    String thisUserID = currentUserActiveChats[index];
    if (user.uid.hashCode <= thisUserID.hashCode) {
      groupChatId = '$_cuserID-$thisUserID';
    } else {
      groupChatId = '$thisUserID-$_cuserID';
    }
    Stream<QuerySnapshot> unreadMessages = Firestore.instance
        .collection('messages')
        .where("chatDetails.to", isEqualTo: user.uid)
        .where("chatDetails.sender", isEqualTo: thisUserID)
        .where("chatDetails.hasRead", isEqualTo: false)
        .snapshots();
    unreadMessages.listen((QuerySnapshot data) {
      unReadMessageLength = data.documents.length;
    });

    Stream<QuerySnapshot> lastMess = Firestore.instance
        .collection('messages')
        .where('groupChatId', isEqualTo: groupChatId)
        .orderBy('chatDetails.timestamp', descending: true)
        .limit(1)
        .snapshots();
    lastMess.listen((QuerySnapshot data) {
      List<DocumentSnapshot> userLastMess = data.documents;
      chatDetailSnapshotList = userLastMess.map((DocumentSnapshot doc) {
        return doc.data;
      }).toList();
    });
    Stream<DocumentSnapshot> userP = usersRef.document(thisUserID).snapshots();
    userP.listen((DocumentSnapshot snap) {
      userDocumentt = Map.from(snap.data);
      if (userDocumentt != null) {
        print('HELLOo $userDocumentt');
        myResult = new InkWell(
          highlightColor: Colors.grey[300],
          onTap: () {
            Navigator.of(context, rootNavigator: true).push(
                new MaterialPageRoute(
                    builder: (context) =>
                        new Chat(chatWith: userDocumentt['id'])));
          },
          onLongPress: () {
            setState(() {
              modifyMode = true;
            });
          },
          child: new Container(
            margin: EdgeInsets.only(left: 15.0, right: 15.0),
            child: new Column(
              children: <Widget>[
                new Row(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[

                    new Expanded(
                      child: new Container(
                        child: new Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            new Container(
                              margin: EdgeInsets.only(left: 17.0, top: 5.0),
                              child: new Text(
                                userDocumentt['username'],
                                style: new TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 16.0,
                                ),
                              ),
                            ),
                            new Container(
                              margin: EdgeInsets.only(left: 17.0, top: 7.0),
                              child: new Text(
                                chatDetailSnapshotList[0]["chatDetails"]
                                    ["content"],
                                maxLines: 1,
                                overflow: TextOverflow.ellipsis,
                                style: new TextStyle(
                                  fontSize: 15.0,
                                  color: Colors.grey[800],
                                ),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
                new Container(
                  margin: EdgeInsets.only(left: 72.0, top: 6.0, bottom: 6.0),
                  child: new Divider(
                    color: Colors.grey[300],
                    height: 10.0,
                  ),
                ),
              ],
            ),
          ),
        );
      } else {
        print('HELLLLOOO $userDocumentt');
        myResult = CircularProgressIndicator();
      }
    });
    return myResult;
  }

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Я думаю, вы не возвращаете поток, попробуйте это.

buildChatList(BuildContext context, int index) {
Map<String, dynamic> userDocumentt;
print('INDEX $index COUNT $currentUserActiveChatsLength');
String thisUserID = currentUserActiveChats[index];
if (user.uid.hashCode <= thisUserID.hashCode) {
  groupChatId = '$_cuserID-$thisUserID';
} else {
  groupChatId = '$thisUserID-$_cuserID';
}
Stream<QuerySnapshot> unreadMessages = Firestore.instance
    .collection('messages')
    .where("chatDetails.to", isEqualTo: user.uid)
    .where("chatDetails.sender", isEqualTo: thisUserID)
    .where("chatDetails.hasRead", isEqualTo: false)
    .snapshots();
unreadMessages.listen((QuerySnapshot data) {
  unReadMessageLength = data.documents.length;
});

Stream<QuerySnapshot> lastMess = Firestore.instance
    .collection('messages')
    .where('groupChatId', isEqualTo: groupChatId)
    .orderBy('chatDetails.timestamp', descending: true)
    .limit(1)
    .snapshots();
lastMess.listen((QuerySnapshot data) {
  List<DocumentSnapshot> userLastMess = data.documents;
  chatDetailSnapshotList = userLastMess.map((DocumentSnapshot doc) {
    return doc.data;
  }).toList();
});
myResult = Stream<DocumentSnapshot> userP = usersRef.document(thisUserID).snapshots();
userP.listen((DocumentSnapshot snap) {
  userDocumentt = Map.from(snap.data);
  if (userDocumentt != null) {
    print('HELLOo $userDocumentt');
    return InkWell(
      highlightColor: Colors.grey[300],
      onTap: () {
        Navigator.of(context, rootNavigator: true).push(
            new MaterialPageRoute(
                builder: (context) =>
                    new Chat(chatWith: userDocumentt['id'])));
      },
      onLongPress: () {
        setState(() {
          modifyMode = true;
        });
      },
      child: new Container(
        margin: EdgeInsets.only(left: 15.0, right: 15.0),
        child: new Column(
          children: <Widget>[
            new Row(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                new Expanded(
                  child: new Container(
                    child: new Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        new Container(
                          margin: EdgeInsets.only(left: 17.0, top: 5.0),
                          child: new Text(
                            userDocumentt['username'],
                            style: new TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 16.0,
                            ),
                          ),
                        ),
                        new Container(
                          margin: EdgeInsets.only(left: 17.0, top: 7.0),
                          child: new Text(
                            chatDetailSnapshotList[0]["chatDetails"]
                                ["content"],
                            maxLines: 1,
                            overflow: TextOverflow.ellipsis,
                            style: new TextStyle(
                              fontSize: 15.0,
                              color: Colors.grey[800],
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ],
            ),
            new Container(
              margin: EdgeInsets.only(left: 72.0, top: 6.0, bottom: 6.0),
              child: new Divider(
                color: Colors.grey[300],
                height: 10.0,
              ),
            ),
          ],
        ),
      ),
    );
  } else {

    //
    print('HELLLLOOO $userDocumentt');
    myResult = CircularProgressIndicator();
  }
});
return myResult;

}

0 голосов
/ 10 января 2019

Для Firestore. Имеет смысл использовать «StreamBuilder» для обновлений в режиме реального времени. Я даю вам пример кода, который у меня есть, надеюсь, это поможет.

StreamBuilder(
                 stream: Firestore.instance.collection("YourCollectionNAme").snapshots(),
                 builder: (BuildContext  context,AsyncSnapshot snapshot)
                 {
                   if (snapshot.hasData)
                   {
                   return new ListView.builder(
                     shrinkWrap: true,
                     itemCount: snapshot.data.documents.length,
                     padding: const EdgeInsets.only(top: 5.0),
                     itemBuilder: (context, index) {
                      DocumentSnapshot ds = snapshot.data.documents[index];
                      return new Row(
                        textDirection: TextDirection.ltr,
                          children: <Widget>[
                            Expanded (child:Text(ds["Field-of-collection"]) ),
                            Expanded (child:Text(ds["another-field"]) ),
                            Expanded (child:Text(ds["last-field"].toString()) ),


                          ],
                      );
      }
                   );
                 }
                 },
               )

Я использую вид списка длямоя коллекция Firestore.

0 голосов
/ 18 октября 2018

вам нужно будет использовать StreamBuilder вместо обычного ListView.builder ().установите флажок ссылка

Обновление данных не означает обновления представления, необходимого для перестройки этого виджета при каждой добавленной новой записи, поэтому, когда вы HOT RELOAD загружаете приложение, вы запускаете setState () вручную, так чтопоказывает обновление.

StreamBuilder сделает это setState () для вас при каждой новой записи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...