Я пытаюсь внедрить систему чата во флаттер с внутренним интерфейсом в ядре asp. net и подключением в реальном времени через SignalR.
Цель - открыть чат комнате, все отправленные ранее сообщения загружаются в комнату чата, для этого я вызываю метод в бэкэнде под названием «Connect». После нажатия «Hub» он вызывает мой интерфейсный метод и отправляет обратно список сообщений, этот поток корректен и работает, но я столкнулся с проблемой, когда хочу отобразить сообщения во флаттере, вот как я пытался сделайте это с помощью StreamBuilder:
class GrpMessage extends StatefulWidget {
final GrpMessages group;
final HubConnection connection;
GrpMessage({Key key, @required this.group, @required this.connection})
: super(key: key);
@override
_GrpMessageState createState() => _GrpMessageState();
}
class _GrpMessageState extends State<GrpMessage> {
List<Messages> listMessages = new List();
final webSocketStream = BehaviorSubject<List<Messages>>();
@override
void initState() {
super.initState();
connect();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Center(child: Text(widget.group.name))),
body: testSocket()
);}
connect() async {
await widget.connection
.invoke("Connect", args: <Object>[widget.group.idEvent]);
widget.connection.on("ReceiveGroupMsg", grpReceived);
}
grpReceived(List<Object> parameters) {
List<dynamic> msg = parameters[0];
for (dynamic msg in msg) {
listMessages.add(Messages.fromJson(msg));
}
webSocketStream.sink.add(listMessages);
}
Widget testSocket() {
return StreamBuilder<List<Messages>>(
stream: webSocketStream.stream,
initialData: listMessages,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
MessagesList(messages: snapshot.data),
]);
} else if (snapshot.hasError) {
return Center(child: Text("No messages to display"));
}
return Center(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).primaryColor));
});
}
MessagesList - еще один виджет, он хорошо воспроизводится, но код не актуален, поэтому я не буду его публиковать :) Я чувствую, что что-то упустил с Вещь потока, я ожидал бы, когда я добавлю listMessages в поток, что поток затем отобразит сообщения, но это не так (даже если listMessages правильно заполнен данными из серверной части).
Я новичок во Флаттере. Это, безусловно, ошибка с моей стороны. Если бы кто-то мог указать мне, что я делаю неправильно, это было бы очень полезно!
Заранее спасибо,
Lio