nicegui 非常适合做实时通信的页面。官方仓库的例子中,有一个聊天室的案例。今天我将带大家深入了解其细节。
本节需要一些前置知识,这些都在前面的章节有讲解:
refreshable
的刷新机制本节,我们将重点学习 refreshable
的广播机制。从利用上一节学会的客户端连接,一步步优化代码,最终得到官方提供的 refreshable
实现版本。
这个过程中,还会接触到 空容器
的使用。
本节使用的 nicegui 版本为 1.4.24
为了更好理解,我去掉一些非必要的代码(布局),下面动图展示了简化过后的聊天室:
功能类似 聊天群:
首先,因为要求每个用户的页面都是独立状态,使用 ui.page
定义路由页面即可。
其次,需要一个全局数据记录所有用户的消息:
示意图:
数据收集的流程非常简单直观,关键是,当用户A发送消息后,此时应该通知所有的用户刷新界面( 注意,只是聊天记录区域,而不是整个页面刷新 )。
所以,聊天室最关键的地方在于, 如何通知所有的界面(客户端连接)刷新特定的区域(可以理解为某个容器组件对象)
在上一节中,我们已经学会利用客户端连接,统一操作所有的页面。所以,我们有了第一个版本的实现:
先看界面代码:
现在看看61行关键的函数 refresh_all_clients
上面遍历全局消息列表,创建消息界面的函数如下:
ui.chat_message
这一版实现,代码很繁琐,并且有许多缺陷。
现在看进一步优化的实现版本
既然用户访问页面的时候,就会执行路由函数里面的代码,从而创建一系列组件。我们可以在那个时候,把消息的 column 容器和相关信息(用户名)给全局保存起来: