Потребитель постоянно добавляет последнее значение в список при использовании didChangeDependencies () - PullRequest
0 голосов
/ 16 февраля 2020

У меня проблема с Consumer-Widget из пакета provider, и я просто не могу обернуть голову вокруг того, что здесь происходит.

Каждый раз, когда появляется или исчезает экранная клавиатура прочее, последнее сообщение из потока продолжает добавляться в просмотр списка. Это ожидаемое поведение? Я что-то здесь не так делаю?

SocketService.dart


class SocketService {
    final _messageStreamController = StreamController<Message>.broadcast();
    StreamSink<Message> get messages_sink => _messageStreamController.sink;
    Stream<Message> get messages => _messageStreamController.stream;

    SocketService({this.user}) {

        socket = IO.io('localhost:3000', <String, dynamic>{
            'transports': ['websocket'],
            // 'extraHeaders': {'foo': 'bar'} // optional
        });

        socket.on('receive_message', (data) {
            _messageStreamController.sink.add(Message.fromJson(data));
        });
    }

}

PageChat.dart


List<Widget> messages = List<Widget>();
...
@override
  void didChangeDependencies() {
    super.didChangeDependencies();
    if(MediaQuery.of(context).viewInsets.bottom != 0) {
        _autoJump();
    }  
  }

void _autoJump() {
        SchedulerBinding.instance.addPostFrameCallback((_) {
            // itemScrollController.jumpTo(index: messages.length-1);
            _listViewController.jumpTo(_listViewController.position.maxScrollExtent);
        });
    }

Widget build(BuildContext context) {
    return StreamProvider(
            create: (context) => Provider.of<SocketService>(context, listen:false).messages,
            child: _buildChat()
);
}


Widget _buildChat() {
    return Consumer<Message>(
            builder: (context, messageList, _) {
                if(message != null && message.room == widget.roomId) {

                messages.add(message);
                _autoJump();
                }


                return Column(
                    children: <Widget>[
                        Expanded(
                            child: ListView.builder(
                                controller: _listViewController,
                                itemCount: messages.length,
                                itemBuilder: (context, index) => messages[index],
                            )
                        ),
                        Row(
                                    children: <Widget>[
                                        Expanded(child: TextField(
                                            controller: _textFieldController,
                                            decoration: InputDecoration.collapsed(hintText: 'Messsage...'),
                                            onChanged: (value) {_message = value;},
                                        ),),
                                        MaterialButton(
                                            onPressed: _sendMessage, 
                                            child: Icon(FontAwesomeIcons.solidPaperPlane, size: 20),)
                                    ],
                                ),
                            ),
                  ],
                );
            },
    );
...






...