【问题标题】:Flutter Reactive Programming (Stream) with Signal R使用 Signal R 的 Flutter 反应式编程(流)
【发布时间】:2020-05-13 20:48:00
【问题描述】:

我尝试在颤振中实现一个聊天系统,其后端位于 asp.net 核心中,并通过 SignalR 实时连接。

目标是当我打开一个聊天室时,之前发送的所有消息都加载到聊天室中,为此,我在后端调用了一个名为“Connect”的方法。一旦“集线器”被击中,它就会调用我的前端方法并发回消息列表,这个流程是正确的并且可以工作,但是当我想在颤动中显示消息时遇到了问题,这就是我尝试的方法在 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 正确地填充了后面的数据-结束)。

我是 Flutter 的新手,这肯定是我的一个错误,如果有人能指出我做错了什么,那将非常有帮助!

提前致谢,

【问题讨论】:

  • 当你运行你的应用程序时,你的 UI 是什么状态?它是循环进度指示器还是错误或只是空的
  • 只是空的,看起来流实际上是空的,但 listMessages 不是
  • snapshot.data 包含什么?你有没有尝试打印出来看看它有什么样的数据?
  • 它有一个消息列表,但它是空的,它没有更新
  • 你确定你在参数[0]中收到了json数组并且它不为空吗?

标签: flutter signalr bloc reactive-streams


【解决方案1】:

所以我找到了答案...我用于 Signal R 的库提到当我从服务器调用方法时我必须等待,我必须删除等待,然后它工作正常。感谢 Saed 的帮助!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2015-08-21
  • 2019-03-16
  • 1970-01-01
  • 2016-06-29
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多