You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flet视图无法正确更新求助:排班生成功能视图不刷新

解决Flet自定义控件内Column更新不显示及排班内容重置问题

问题原因

你的ShiftsView是UserControl自定义控件,修改其内部Column的子控件后,仅调用page.update()无法触发该自定义控件的UI刷新;另外你还需要每次点击时清除旧的排班文本,只保留按钮和新内容。

修复后的完整代码

import flet
from flet import Text, UserControl, ElevatedButton, Column
from .controller import Controller

class ShiftsView(UserControl):
    def __init__(self, page, controller):
        super().__init__()
        self.page = page
        self.controller = controller
        self._add_listeners()
  
    def _add_listeners(self):
        def run_shifts(workers):
            print(workers)
            self.show_workers(workers)
    
        self.controller.add_listener('WORKERS::RUN_SHIFTS', run_shifts)
    
    def build(self):
        self.page_view = Column(
            controls=[
                ElevatedButton("Generate shift", on_click=self.button_clicked),
            ]
        )
    
        return self.page_view
    
    def button_clicked(self, e):
        self.controller.get_shifts()
        # 无需在此调用page.update(),listener触发的show_workers会处理更新
    
    def show_workers(self, workers):
        print("workers", workers)
        # 保留Column中的按钮,清空之前的排班文本
        self.page_view.controls = [self.page_view.controls[0]]
        # 添加新的排班人员文本
        for w in workers:
            self.page_view.controls.append(Text(w[0]))
        # 更新当前自定义控件,触发内部UI刷新
        self.update()

关键修改点

  • 清空旧内容:每次生成新排班时,重置Column的controls列表,只保留初始的按钮控件,确保旧的排班文本被清除。
  • 正确触发更新:调用self.update()替代self.page.update(),因为修改的是自定义控件内部的子元素,需要触发该控件自身的UI刷新。
  • 移除冗余更新:按钮点击事件中无需调用page.update(),避免不必要的全局刷新。

内容的提问来源于stack exchange,提问作者winttuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:14:55