Skip to content

Page 继承自:BasePage, AdaptiveControl, Control, BaseControl

Page 是 View 控件的容器。

新的用户会话启动时,会自动创建一个页面实例和根视图。

示例 ​

python
import flet as ft


class ButtonControl(ft.Container):
    def __init__(self, text):
        super().__init__()
        self.content: ft.Text = ft.Text(text)
        self.border = ft.Border.all(1, ft.Colors.BLACK_54)
        self.border_radius = 3
        self.bgcolor = "0x09000000"
        self.padding = 10
        self.visible = False


def main(page: ft.Page):
    page.spacing = 50
    page.vertical_alignment = ft.MainAxisAlignment.CENTER
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

    def on_keyboard(e: ft.KeyboardEvent):
        key.content.value = e.key
        key.visible = True
        shift.visible = e.shift
        ctrl.visible = e.ctrl
        alt.visible = e.alt
        meta.visible = e.meta
        page.update()

    page.on_keyboard_event = on_keyboard

    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text(
                        "Press any key with a combination of CTRL, ALT, SHIFT "
                        "and META keys..."
                    ),
                    ft.Row(
                        controls=[
                            key := ButtonControl(""),
                            shift := ButtonControl("Shift"),
                            ctrl := ButtonControl("Control"),
                            alt := ButtonControl("Alt"),
                            meta := ButtonControl("Meta"),
                        ],
                        alignment=ft.MainAxisAlignment.CENTER,
                    ),
                ]
            )
        )
    )


if __name__ == "__main__":
    ft.run(main)
python
import flet as ft


def main(page: ft.Page) -> None:
    page.title = "Device orientation lock"
    page.appbar = ft.AppBar(
        title=ft.Text("Device orientation Playground"),
        center_title=True,
        bgcolor=ft.Colors.BLUE,
    )

    def handle_media_change(e: ft.PageMediaData) -> None:
        page.show_dialog(
            ft.SnackBar(
                f"I see you rotated the device to {e.orientation.name} orientation. 👀",
                action="Haha!",
                duration=ft.Duration(seconds=3),
            )
        )

    page.on_media_change = handle_media_change

    async def on_checkbox_change(e: ft.Event[ft.Checkbox]) -> None:
        # get selection
        selected = [o for o, checkbox in checkboxes.items() if checkbox.value]
        # apply selection
        await page.set_allowed_device_orientations(selected)

    checkboxes: dict[ft.DeviceOrientation, ft.Checkbox] = {
        orientation: ft.Checkbox(
            label=orientation.name,
            value=True,
            on_change=on_checkbox_change,
            disabled=not page.platform.is_mobile(),  # disabled on non-mobile platforms
        )
        for orientation in list(ft.DeviceOrientation)
    }

    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text(
                        spans=[
                            # shown only on mobile platforms
                            ft.TextSpan(
                                "Select the orientations that should remain enabled "
                                "for the app. "
                                "If no orientation is selected, "
                                "the system defaults will be used.",
                                visible=page.platform.is_mobile(),
                            ),
                            # shown only on non-mobile platforms
                            ft.TextSpan(
                                "Please open this example on a mobile device instead.",
                                visible=not page.platform.is_mobile(),
                                style=ft.TextStyle(weight=ft.FontWeight.BOLD),
                            ),
                        ],
                    ),
                    ft.Column(controls=list(checkboxes.values())),
                ]
            )
        )
    )


if __name__ == "__main__":
    ft.run(main)
python
import flet as ft


def main(page: ft.Page):
    def window_event(e: ft.WindowEvent):
        if e.type == ft.WindowEventType.CLOSE:
            page.show_dialog(confirm_dialog)
            page.update()

    page.window.prevent_close = True
    page.window.on_event = window_event

    async def handle_yes_click(e: ft.Event[ft.Button]):
        await page.window.destroy()

    def handle_no_click(e: ft.Event[ft.OutlinedButton]):
        page.pop_dialog()
        page.update()

    confirm_dialog = ft.AlertDialog(
        modal=True,
        title=ft.Text("Please confirm"),
        content=ft.Text("Do you really want to exit this app?"),
        actions=[
            ft.Button(content="Yes", on_click=handle_yes_click),
            ft.OutlinedButton(content="No", on_click=handle_no_click),
        ],
        actions_alignment=ft.MainAxisAlignment.END,
    )

    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text(
                        'Try exiting this app by clicking window\'s "Close" button!'
                    )
                ]
            )
        )
    )


if __name__ == "__main__":
    ft.run(main)
python
import asyncio

import flet as ft


async def main(page: ft.Page):
    print("Window is hidden on start. Will show after 3 seconds...")
    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text("Hello!"),
                ]
            )
        )
    )

    # some configuration that we want to do before showing the window
    page.window.width = 300
    page.window.height = 200
    page.update()
    await page.window.center()

    # wait for 3 seconds before showing the window
    await asyncio.sleep(3)

    # show the window
    page.window.visible = True
    page.update()


if __name__ == "__main__":
    ft.run(main, view=ft.AppView.FLET_APP_HIDDEN)

如果你在使用 flet build 打包桌面应用时需要此功能,请参见此处。

python
import flet as ft


def main(page: ft.Page):
    page.vertical_alignment = ft.MainAxisAlignment.CENTER
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

    def on_keyboard(e: ft.KeyboardEvent):
        if e.shift and e.key == "S":
            page.show_semantics_debugger = not page.show_semantics_debugger
            page.update()

    page.on_keyboard_event = on_keyboard

    def button_click(e: ft.Event[ft.Button]):
        counter.value = str(int(counter.value) + 1)
        page.update()

    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    counter := ft.Text("0", size=40),
                    ft.Text("Press Shift+S to toggle semantics debugger"),
                    ft.Button(
                        content="Increment number",
                        icon=ft.Icons.ADD,
                        on_click=button_click,
                    ),
                ]
            )
        )
    )


if __name__ == "__main__":
    ft.run(main)
python
import flet as ft


async def main(page: ft.Page):
    def format_locales(locales: list[ft.Locale]) -> str:
        """Format locale list for display."""
        return ", ".join(str(loc) for loc in locales)

    def handle_locale_change(e: ft.LocaleChangeEvent):
        page.add(ft.Text(f"Locales changed: {format_locales(e.locales)}"))

    page.on_locale_change = handle_locale_change
    page.scroll = ft.ScrollMode.AUTO
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER

    initial_locales = (await page.get_device_info()).locales
    page.add(
        ft.SafeArea(
            content=ft.Column(
                controls=[
                    ft.Text(f"Initial locales: {format_locales(initial_locales)}"),
                    ft.Text(
                        "Change your system or browser language to trigger "
                        "on_locale_change.",
                        color=ft.Colors.BLUE,
                    ),
                ]
            )
        )
    )


if __name__ == "__main__":
    ft.run(main)

属性 ​

名称类型默认值说明
multi_viewslist[MultiView][]与此页面关联的多视图列表。
windowWindowWindow(()提供用于监视和控制应用原生操作系统窗口的属性/方法/事件。
routestr'/'获取当前应用路由。 注意: 此属性为只读。
webboolFalse如果应用运行在 Web 浏览器中,则为 True。 注意: 此属性为只读。
pwaboolFalse如果应用作为渐进式 Web 应用(PWA)运行,则为 True。 注意: 此属性为只读。
debugboolFalse如果 Flet 应用的 Flutter 客户端运行在调试模式下,则为 True。 注意: 此属性为只读。
wasmboolFalse如果应用运行在 WebAssembly(WASM)模式下,则为 True。 注意: 此属性为只读。
testboolFalse如果应用运行在测试模式下,则为 True。 注意: 此属性为只读。
multi_viewboolFalse如果应用以多视图支持方式运行,则为 True。 注意: 此属性为只读。
pyodideboolFalse如果应用运行在 Pyodide(WebAssembly)模式下,则为 True。 注意: 此属性为只读。
platform_brightnessOptional[Brightness]None宿主平台当前的亮度模式。 注意: 此属性为只读。
client_ipOptional[str]None已连接用户的 IP 地址。 注意: 此属性仅用于 Web 且为只读。
client_user_agentOptional[str]None已连接用户的浏览器详细信息。 注意: 此属性仅用于 Web 且为只读。
platformOptional[PagePlatform]None应用所运行的操作系统。
fontsOptional[dict[str, str]]None定义应用中要使用的自定义字体。 值是一个字典,其中键表示用于引用的字体族名称,值为:- Key:用于引用的字体族名称。- Value:字体来源,可以是绝对 URL,也可以是本地静态资源的相对路径。支持以下字体文件格式:.ttc、.ttf 和 .otf。 用法示例见此处。
viewslist[View][View()]()页面管理的视图列表。 每个 View 代表应用中一个不同的导航状态或屏幕。 列表中的第一个视图默认被视为活动视图。
theme_modeOptional[ThemeMode]ThemeMode.SYSTEM页面的主题模式。
themeOptional['Theme']None在浅色主题模式下自定义应用的主题。目前,主题只能从「种子」颜色自动生成。例如,从绿色生成浅色主题。
dark_themeOptional['Theme']None在深色主题模式下自定义应用的主题。
theme_animation_styleOptional[AnimationStyle]None覆盖应用主题更改时(例如 theme_mode 在浅色与深色之间切换时)使用的默认动画样式。 提示: 使用 no_animation 可完全禁用主题过渡。
locale_configurationOptional[LocaleConfiguration]None配置支持的语言区域和当前语言区域。
show_semantics_debuggerboolFalse是否开启一个叠加层,显示框架报告的辅助功能(accessibility)信息。
titleOptional[str]None页面或窗口标题。
enable_screenshotsboolFalse允许通过 take_screenshot 方法对整页截图。
mediaPageMediaDataPageMediaData(padding=Padding.zero()()页面或窗口当前的环境度量信息。 每当平台窗口或布局发生变化时(例如旋转设备、调整浏览器窗口大小,或调整键盘、安全区域等系统 UI 元素),此数据都会更新。
widthOptional[Number]None页面的逻辑像素宽度。 注意: - 此属性为只读。 - 在桌面端运行 Flet 应用时,要获取或设置包含窗口装饰(例如标题栏和边框)的完整窗口高度,请改用 window 的 width 属性。
heightOptional[Number]None页面的逻辑像素高度。 注意: - 此属性为只读。 - 在桌面端运行 Flet 应用时,要获取或设置包含窗口装饰(例如标题栏和边框)的完整窗口高度,请改用 window 的 height 属性。
adaptiveOptional[bool]None启用平台特定渲染,或从父控件继承自适应能力。
expandAnnotated[Optional[Union[bool, int]], V.instance_of((bool, int))]None指定此控件是否/如何扩展以填满父布局中的可用空间。 更多信息见此处。 注意: 仅当此控件的直接父级是以下控件或其子类时才生效:Column、Row、View、Page。 抛出异常: ValueError:如果它不是 bool 或 int 类型。
expand_looseboolFalse允许控件在主轴方向有可用空间时扩展,但不要求它填满所有可用空间。 更多信息见此处。 注意: 如果 expand_loose 为 True,则仅在以下条件满足时才生效: - expand 不为 None,且 - 此控件的直接父级是以下控件或其子类之一:Column、Row、View、Page。
colResponsiveNumber12如果此控件的父级是 ResponsiveRow,则此属性决定该控件在屏幕上跨越多少虚拟列。 可以是一个数字,也可以是一个按断点配置不同值的字典,例如 col={"sm": 6}。 值为 0 时会在该断点隐藏控件,因此它不会占用父级 ResponsiveRow 中的任何列。 此控件默认跨越 12 个虚拟列。 | 断点 | 尺寸 | |---|---| | xs | <576px | | sm | ≥576px | | md | ≥768px | | lg | ≥992px | | xl | ≥1200px | | xxl | ≥1400px |
opacityAnnotated[Number, V.between(0.0, 1.0)]1.0定义控件的透明度。 取值范围从 0.0(完全透明)到 1.0(完全不透明,无任何透明感)。 抛出异常: ValueError:如果它不在 0.0 到 1.0(含)之间。
tooltipOptional[TooltipValue]None鼠标悬停在此控件上时显示的工具提示。
badgeOptional[BadgeValue]None显示在此控件顶部的徽章。
visibleboolTrue每个控件都有 visible 属性,默认为 True —— 控件会渲染在页面上。将 visible 设为 False 会彻底阻止控件(及其所有子控件,如果有)渲染到页面画布上。隐藏的控件无法通过键盘或鼠标获得焦点或选中,也不会触发任何事件。
disabledboolFalse每个控件都有 disabled 属性,默认为 False —— 控件及其所有子控件都处于启用状态。 注意: 此属性的值会递归向下传播到所有子控件。 示例: 例如,如果你有一个包含多个输入控件的表单,可以通过禁用容器来一并禁用它们: python ft.Column( disabled = True, controls=[ ft.TextField(), ft.TextField() ] )
rtlboolFalse控件的文本方向是否为从右到左(RTL)。
dataAnyskip_任意类型的自定义数据。
keyOptional['KeyValue']None用于在更新之间保持控件标识稳定的键。

只读属性 ​

名称类型默认值说明
app_visiblebool—应用窗口(或浏览器标签页)当前是否可见。 由 on_app_lifecycle_state_change 驱动:状态为 HIDE 或 PAUSE 时为 False,否则为 True。与控件级别的 visible 属性不同,后者隐藏的是页面本身。
session'Session'—此页面所属的会话。
queryQueryString—当前页面的查询参数。
urlOptional[str]—当前页面的 URL。
namestr—当前页面的名称。
loopasyncio.AbstractEventLoop—当前页面的事件循环。
executorOptional[ThreadPoolExecutor]—当前页面的执行器。
auth'Optional[Authorization]'—当前的授权上下文;如果用户未授权,则为 None。
pubsub'PubSubClient'—当前页面的 PubSub 客户端。
overlaylist[BaseControl]—渲染在页面内容之上的叠加控件列表。
controlslist[BaseControl]—此页面所显示的根视图内容控件。
appbar'Union[AppBar, CupertinoAppBar, None]'—获取或设置视图的顶部应用栏(AppBar 或 CupertinoAppBar)。 应用栏通常显示页面标题以及诸如导航图标、菜单或其他交互元素之类的可选操作。
bottom_appbarOptional[BottomAppBar]—显示在根视图底部的底部应用栏。
navigation_bar'Optional[Union[NavigationBar, CupertinoNavigationBar]]'—根视图的底部导航栏。
drawerOptional[NavigationDrawer]—从前缘(leading edge)打开的导航抽屉。
end_drawerOptional[NavigationDrawer]—从后缘(trailing edge)打开的导航抽屉。
decorationOptional[BoxDecoration]—根视图容器的背景装饰。
foreground_decorationOptional[BoxDecoration]—绘制在根视图内容之上的前景装饰。
floating_action_buttonOptional[FloatingActionButton]—为根视图显示的悬浮操作按钮。
floating_action_button_locationOptional[Union[FloatingActionButtonLocation, OffsetValue]]—悬浮操作按钮在根视图中的位置。
horizontal_alignmentCrossAxisAlignment—根视图子控件的水平对齐方式。
vertical_alignmentMainAxisAlignment—根视图子控件的垂直对齐方式。
spacingNumber—根视图子控件之间的默认间距。
paddingOptional[PaddingValue]—根视图内容的内边距。
bgcolorOptional[ColorValue]—根视图的背景色。
scrollOptional[Union[ScrollMode, Scrollbar]]—根视图内容的滚动行为模式。
auto_scrollbool—根视图是否应在内容变化时自动滚动到末尾。
serviceslist[Service]—附加到根视图生命周期的服务实例。
parentOptional['BaseControl']—此控件的直接祖先(父级)。 默认为 None,只有在此控件被挂载(加入页面树)后才有值。 Page 控件(页面树的根)是个例外 —— 它的 parent 始终为 None。
page'Page'—此控件所属的页面。

事件 ​

名称类型默认值说明
on_platform_brightness_changeOptional[EventHandler[PlatformBrightnessChangeEvent]]None应用宿主平台的亮度发生变化时调用。
on_locale_changeOptional[EventHandler[LocaleChangeEvent]]None宿主平台的语言区域偏好/设置发生变化时调用。 例如,当用户更新设备语言设置或浏览器首选语言时。
on_app_lifecycle_state_changeOptional[EventHandler[AppLifecycleStateChangeEvent]]None应用生命周期状态发生变化时调用。
on_route_changeOptional[EventHandler[RouteChangeEvent]]None页面路由发生变化时调用,无论是以编程方式、通过编辑应用 URL,还是使用浏览器的后退/前进按钮。
on_view_popOptional[EventHandler[ViewPopEvent]]None用户点击 AppBar 控件中自动生成的「返回」按钮时调用。
on_views_pop_untilOptional[EventHandler[ViewsPopUntilEvent]]None当 pop_views_until 到达目标视图时调用。 事件携带调用方传入的结果值。
on_keyboard_eventOptional[EventHandler[KeyboardEvent]]None按下键盘按键时调用。
on_connectOptional[ControlEventHandler['Page']]NoneWeb 用户(重新)连接到页面会话时调用。 首次打开应用页面时不会触发,但在页面刷新、或 Flet Web 客户端在计算机解锁后重新连接时会触发。此事件可用于检测 Web 用户何时变为「在线」。
on_disconnectOptional[ControlEventHandler['Page']]NoneWeb 用户断开与页面会话的连接时调用,即关闭浏览器标签页/窗口时。
on_closeOptional[ControlEventHandler['Page']]None会话在配置的时间(默认 60 分钟)后过期时调用。
on_loginOptional[EventHandler[LoginEvent]]NoneOAuth 授权流程成功或失败时调用。 更多信息和示例见身份验证指南。
on_logoutOptional[ControlEventHandler['Page']]None调用 page.logout() 后调用。
on_errorOptional[ControlEventHandler['Page']]None发生未处理的异常时调用。
on_multi_view_addOptional[EventHandler[MultiViewAddEvent]]None创建新的多视图时调用。 事件载荷包含新视图的标识符以及打开该视图时传入的初始数据。
on_multi_view_removeOptional[EventHandler[MultiViewRemoveEvent]]None移除多视图时调用。 事件载荷包含被移除视图的标识符。
on_resizeOptional[EventHandler['PageResizeEvent']]None用户调整包含 Flet 应用的浏览器或原生操作系统窗口大小时调用 示例: python def main(page: ft.Page): def handle_page_size(e): print("New page size:", page.window.width, page.window_height) page.on_resize = handle_page_size
on_media_changeOptional[EventHandler[PageMediaData]]Nonemedia 发生变化时调用。

方法 ​

名称类型默认值说明
get_controlOptional[BaseControl]—根据 id 获取控件。 示例: python def main(page: ft.Page): x = ft.IconButton(ft.Icons.ADD) page.add(x) print(type(page.get_control(x._i)))
render——将组件树渲染为根视图的控件。 渲染结果会替换 page.views[0].controls,然后触发初始页面更新和组件更新调度器启动。 参数: component:要渲染的组件函数。 *args:传递给 component 的位置参数。 **kwargs:传递给 component 的关键字参数。
render_views——将组件树渲染为页面视图的完整列表。 渲染结果会替换 page.views,然后触发初始页面更新和组件更新调度器启动。 参数: component:要渲染的组件函数。 *args:传递给 component 的位置参数。 **kwargs:传递给 component 的关键字参数。
schedule_update——将此页面加入队列,以便延迟批量更新。
updateNone—将待处理的状态变更推送到客户端。 参数: *controls:要修补的特定控件。省略时,修补整个页面状态。
errorNone—向当前会话/客户端报告应用错误。 参数: message:要发送的错误消息。
before_event———
wait_until_visibleNone—挂起,直到应用窗口(或浏览器标签页)可见。 当已经可见时立即返回。在隐藏期间,客户端的渲染管线会暂停,因此一个不断推送帧的生产者循环只会堆积积压,在恢复时淹没客户端。在此类循环的顶部等待此方法会让生产者暂停,直到标签页返回: python while True: await page.wait_until_visible() await raw_image.render(produce_frame()) 流式控件(RawImage、MatplotlibChart)内部已经对发送加上了此门控。
run_taskFuture[RetT]—将 handler 协程作为新任务运行在与此页面关联的事件循环中。
run_threadNone—将 handler 函数作为新线程运行在与此页面关联的执行器中。
push_routeNone—将新的导航路由推入浏览器历史栈。更改路由会触发 page.on_route_change 事件处理器。 示例: python import asyncio import flet as ft def main(page: ft.Page): page.title = "Routes Example" def route_change(): page.views.clear() page.views.append( ft.View( route="/", controls=[ ft.AppBar( title=ft.Text("Flet app"), ), ft.Button( "Visit Store", on_click=lambda: asyncio.create_task( page.push_route("/store") ), ), ], ) ) if page.route == "/store": page.views.append( ft.View( route="/store", controls=[ ft.AppBar( title=ft.Text("Store"), ), ft.Button( "Go Home", on_click=lambda: asyncio.create_task( page.push_route("/") ), ), ], ) ) page.update() async def view_pop(e): if e.view is not None: print("View pop:", e.view) page.views.remove(e.view) top_view = page.views[-1] await page.push_route(top_view.route) page.on_route_change = route_change page.on_view_pop = view_pop route_change() if __name__ == "__main__": ft.run(main) 参数: route:新的导航路由。 **kwargs:要添加到路由的额外查询字符串参数。
navigateNone—导航到新的路由(同步便捷包装)。 等价于 asyncio.create_task(page.push_route(route, **kwargs))。在无法使用 await 的同步回调(例如 on_click)中使用它。 参数: route:新的导航路由。 **kwargs:要添加到路由的额外查询字符串参数。
pop_views_untilNone—从导航栈中弹出视图,直到找到具有给定 route 的视图,然后通过 on_views_pop_until 事件传递 result。 示例: python import flet as ft def main(page: ft.Page): def on_pop_result(e: ft.ViewsPopUntilEvent): page.show_dialog(ft.SnackBar(ft.Text(f"Result: {e.result}"))) page.on_views_pop_until = on_pop_result # ... later, from a deeply nested view: async def go_back(ev): await page.pop_views_until("/", result="Done!") 参数: route:要返回导航到的目标路由。必须与 views 中某个现有 View 的 route 匹配。 result:可选值,在目标视图上传递给 on_views_pop_until。 抛出异常: ValueError:如果 views 中不存在具有给定 route 的视图。
get_upload_urlstr—为内置上传存储生成预签名上传 URL: * file_name —— 相对于上传存储的路径。 * expires —— URL 的存活时间(秒)。 示例: python upload_url = page.get_upload_url("dir/filename.ext", 60) 要启用内置上传存储,请在 ft.run() 调用中提供 upload_dir 参数: python ft.run(main, upload_dir="uploads")
login'AT'—启动 OAuth 流程。 更多信息和示例见身份验证指南。
logoutNone—清除当前授权上下文。更多信息和示例见身份验证指南。
get_device_infoOptional[DeviceInfo]—返回设备信息。 返回值: 当前平台的设备信息对象,如果不可用则为 None。
set_allowed_device_orientationsNone—在移动设备上运行时,限制应用允许的方向。 参数: orientations:允许的设备方向列表。设为空列表以使用系统默认行为。 抛出异常: FletUnsupportedPlatformException:如果在非移动平台上调用此方法。 限制: - Android:在 Android 16(API 36)或更高版本上,此方法将无法更改显示宽度 ≥ 600 dp 的设备的方向。更多详情见 Android 16 文档 此处。 此外,Android 将 屏幕方向 限制为以下组合: - [] → unspecified - [PORTRAIT_UP] → portrait - [LANDSCAPE_LEFT] → landscape - [PORTRAIT_DOWN] → reversePortrait - [PORTRAIT_UP, PORTRAIT_DOWN] → userPortrait - [LANDSCAPE_RIGHT] → reverseLandscape - [LANDSCAPE_LEFT, LANDSCAPE_RIGHT] → userLandscape - [PORTRAIT_UP, LANDSCAPE_LEFT, LANDSCAPE_RIGHT] → user - [PORTRAIT_UP, PORTRAIT_DOWN, LANDSCAPE_LEFT, LANDSCAPE_RIGHT] → fullUser - iOS:仅在 iPad 上禁用多任务处理时才会遵循此设置。 你可以决定在 iPad 上退出多任务处理,这样此设置会生效,但你的应用将不再支持滑过(Slide Over)和分屏(Split View)多任务处理。如果你决定退出多任务处理,可以在 Xcode 的 Deployment Info 中将「Requires full screen」设为 true。
addNone—向页面添加控件。 示例: python page.add(ft.Text("Hello!"), ft.FilledButton("Button"))
insertNone—在 page.controls 列表的指定索引处插入控件。
removeNone—从 page.controls 列表中移除指定的控件。
remove_atNone—从 page.controls 列表的指定索引处移除控件。
cleanNone—移除所有根视图控件并向客户端发送更新。
scroll_toNone—将滚动位置移动到绝对 offset、相对 delta,或跳转到具有指定 scroll_key 的控件。 方法详情和示例见 scroll_to。
show_dialogNone—显示一个对话框并管理其关闭生命周期。 此方法将指定的 dialog 添加到活动对话框栈中,并在页面上渲染它。对话框的 on_dismiss 处理器会被临时包装,以确保对话框从栈中移除并适当地触发其关闭事件。 参数: dialog:要显示的对话框实例。必须尚未打开。 抛出异常: RuntimeError:如果指定的对话框已经打开。
pop_dialogOptional[DialogControl]—关闭最近打开的对话框。 此方法在活动对话框栈中搜索当前打开的最顶层对话框,将其标记为已关闭,更新其状态,并返回该已关闭的对话框。 返回值: 找到的已关闭对话框实例,否则为 None。
show_drawer——显示抽屉。 抛出异常: ValueError:如果未定义 drawer。
close_drawer——关闭抽屉。
show_end_drawer——显示末端抽屉。 抛出异常: ValueError:如果未定义 end_drawer。
close_end_drawer——关闭末端抽屉。
take_screenshotbytes—对整页(含叠加层)截图。 参数: pixel_ratio:所截截图的像素比。如果为 None,将使用设备特定的像素比。 delay:截图前的延迟。如果未指定,延迟为 20 毫秒。 返回值: PNG 格式的截图。
take_animationlist[bytes]—在一次往返中捕获页面的动画截图序列。frame_delays_ms 中的每一项是捕获该帧前要等待的毫秒数。等待和捕获循环完全在 Flutter 侧运行,因此动画时序不会像 Python 驱动的 take_screenshot 循环那样被 Python-Flutter 的 RPC 延迟扭曲。 要求 enable_screenshots = True。 参数: name:捕获帧的名称前缀(用于调试)。 frame_delays_ms:每帧的延迟(毫秒)。列表长度决定捕获的帧数。 pixel_ratio:捕获帧的像素比。如果为 None,将使用设备特定的像素比。 返回值: PNG 编码的帧列表,每项对应 frame_delays_ms 中的一项。
is_isolated——返回此控件是否被标记为隔离。 隔离控件会被排除在父级驱动的更新遍历之外,并需要自行管理更新边界。
init——在控件实例初始化之后、第一次构建/更新周期之前调用。 重写此钩子以执行依赖已初始化字段的轻量级设置。不要在此处调用 update()。
build——在控件初始化期间调用一次,用于定义其子控件。在此方法中 page 属性可用。
before_update——每当此控件被更新时都会调用此方法。 注意: 务必不要在此处调用或请求 update()。
did_mount——在控件挂载到页面树之后调用。 重写此方法以启动需要已挂载页面的资源,例如订阅、定时器或服务监听器。
will_unmount——在控件从页面树移除之前调用。 重写此方法以释放 did_mount() 中创建的资源,例如订阅、定时器或外部句柄。
get_data_channel——解析为此 widget 在 Dart 侧分配的 [DataChannel]。模式: on_data_channel_open: Optional[ft.EventHandler[DataChannelOpenEvent]] = None def init(self): self.on_data_channel_open = self._on_open def _on_open(self, e): self._channel = self.get_data_channel(e.channel_id) 幂等 —— 底层的 Connection 会按 id 缓存 DataChannel,因此重复调用会返回同一实例。没有错误路径:该 id 始终来自框架触发的事件,所以当此方法运行时,通道在两端都已存在。

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