Реактивное программирование флаттера (поток) с сигналом R - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь внедрить систему чата во флаттер с внутренним интерфейсом в ядре 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

1 Ответ

0 голосов
/ 29 января 2020

Итак, я нашел ответ ... В библиотеке, которую я использую для Signal R, упоминается, что мне нужно ждать, когда я вызываю метод с сервера, мне пришлось удалить ожидание, и тогда оно работало нормально. Спасибо Саеду за помощь!

...