主题
发布订阅 (PubSub)
如果你使用 Flet 构建聊天应用,你需要以某种方式在不同的页面会话(sessions)之间传递用户消息。当某个用户发送消息时,该消息应当被广播给所有其他正在运行的应用会话,并实时渲染呈现在他们的页面上。
Flet 提供了简单的内置发布订阅(PubSub)通信机制,用于实现多会话之间的异步通信。
Flet PubSub 既允许向所有应用会话广播消息,也支持仅向特定的“主题(topic)”(或称“通道 (channel)”)订阅者发送私密消息。
典型的 PubSub 使用场景及流程如下:
- 订阅消息:在应用会话启动时,调用
subscribe()接收全局广播消息,或者使用subscribe_topic()订阅特定主题。 - 发送消息:在某个特定事件触发(如点击“发送”按钮)时,调用
send_all()发送全局广播,或者使用send_all_on_topic()向特定主题发送消息。 - 取消订阅:在某些事件(如点击“离开群聊”按钮)发生时,调用
unsubscribe()取消广播订阅,或调用unsubscribe_topic()。 - 全部清理:在页面关闭事件
page.on_close回调中,调用unsubscribe_all()取消订阅所有内容。
以下是使用 PubSub 机制实现的简单即时聊天应用示例:
python
import flet as ft
def main(page: ft.Page):
page.title = "Flet Chat"
# 订阅全局广播消息
def on_message(msg):
messages.controls.append(ft.Text(msg))
page.update()
page.pubsub.subscribe(on_message)
def send_click(e):
page.pubsub.send_all(f"{user.value}: {message.value}")
# 清空消息输入表单
message.value = ""
page.update()
messages = ft.Column()
user = ft.TextField(hint_text="Your name", width=150)
message = ft.TextField(hint_text="Your message...", expand=True) # 占满所有剩余空间
send = ft.Button("Send", on_click=send_click)
page.add(messages, ft.Row(controls=[user, message, send]))
ft.run(main, view=ft.AppView.WEB_BROWSER)聊天应用运行效果: 