【发布时间】: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