У меня проблема с 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),)
],
),
),
],
);
},
);
...