Así es como configuro la stream

  StreamController<List<MessageFromCloudDetail>> _messageFromCloudDetail;

Así es como agregarle datos

ChatApiClient().fetchDetail(http.Client(),documentId).then((data){
    _messageFromCloudDetail.add(data);
});

Y aquí está mi streambuilder

StreamBuilder <List<MessageFromCloudDetail>>(
                            stream:_messageFromCloudDetail.stream,
                            builder: (context, snapshot) {
                              switch (snapshot.connectionState) {
                                case ConnectionState.none:
                                case ConnectionState.waiting:
                                  return Container(
                                    child: Center(
                                      child: CircularProgressIndicator(),
                                    ),
                                  );
                                default:
                                  return new Flexible(
                                    child: ChatBuilder(
                                        querySnapshot: snapshot.data,
                                        userFullname: userFullname,
                                        userId: userId,
                                        roomId: documentId),
                                  );
                              }
                            }),

Para la primera carga / apertura, se muestran los datos. Pero cuando trato de agregar nuevos datos como este

    ChatApiClient().inputDetail(documentId, userId, _textController.text ).then((result){
 // [{"chatDetailId":"3","roomId":"1","from":"2","messageContent":"4","createdDate":"2019-12-02 13:53:25","chatImage":null}] 
      _messageFromCloudDetail.sink.add(result);
    });

Pero está cambiando al nuevo json en lugar de agregar nuevos datos. Entonces mi pregunta es, ¿cómo puedo agregar nuevos datos a la transmisión?

Nota: por favor no me diga que vuelva a cargar todos los datos nuevamente.

Aquí el log

Primera página de carga

I/flutter (19129): AsyncSnapshot<List<MessageFromCloudDetail>>(ConnectionState.waiting, null, null)
I/flutter (19129): AsyncSnapshot<List<MessageFromCloudDetail>>(ConnectionState.active, [Instance of 'MessageFromCloudDetail'], null)

Después de enviar algo

W/IInputConnectionWrapper(19129): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(19129): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(19129): getTextAfterCursor on inactive InputConnection
I/flutter (19129): AsyncSnapshot<List<MessageFromCloudDetail>>(ConnectionState.active, [Instance of 'MessageFromCloudDetail'], null)

Mi clase

class MessageFromCloudDetail {
  String roomId;
  String from;
  String messageContent;
  String createdDate;
  String chatImage;

  MessageFromCloudDetail(
      {this.roomId, this.from, this.messageContent, this.createdDate, this.chatImage});

  factory MessageFromCloudDetail.fromJson(Map<String, dynamic> json) {
    return MessageFromCloudDetail(
        roomId: json['roomId'] as String,
        from: json['from'] as String,
        messageContent: json['messageContent'] as String,
        createdDate: json['createdDate'] as String,
        chatImage: json['chatImage'] as String
    );
  }
}
0
Boby 2 dic. 2019 a las 10:40

2 respuestas

La mejor respuesta

Gracias a @pskink. He solucionado mi problema, así es como agrego nuevos datos

Primero cambio la forma en que cargo los datos por primera vez

List<MessageFromCloudDetail> listMessage = <MessageFromCloudDetail>[];

    listMessage =
            await ChatApiClient().fetchDetail(http.Client(), documentId);
        if (this.mounted) {
          _messageFromCloudDetail.sink.add(listMessage);
        }

Y entonces

Future _handleSubmitted(String text) async {
    MessageFromCloudDetail newMessage;
    newMessage = MessageFromCloudDetail(
        messageContent: _textController.text,
        from: userId,
        createdDate: DateTime.now().toString(),
        chatImage: "");
    listMessage.add(newMessage);
    listMessage.sort((a, b) => b.createdDate.compareTo(a.createdDate));
    _messageFromCloudDetail.sink.add(listMessage);
    _textController.text = "";
  }
0
Boby 2 dic. 2019 a las 10:00

Creo que simplemente está reemplazando los datos antiguos por los más nuevos. No sé cómo está hecha su estructura de datos, pero probablemente necesite adjuntar datos nuevos a los más antiguos.

1
Marco Galetta 2 dic. 2019 a las 08:13