Skip to content

发布订阅 (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)

聊天应用运行效果: 聊天应用


关注我,学习大模型、大数据、Python等热门技术。