主题
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_views | list[MultiView] | [] | 与此页面关联的多视图列表。 |
window | Window | Window(() | 提供用于监视和控制应用原生操作系统窗口的属性/方法/事件。 |
route | str | '/' | 获取当前应用路由。 注意: 此属性为只读。 |
web | bool | False | 如果应用运行在 Web 浏览器中,则为 True。 注意: 此属性为只读。 |
pwa | bool | False | 如果应用作为渐进式 Web 应用(PWA)运行,则为 True。 注意: 此属性为只读。 |
debug | bool | False | 如果 Flet 应用的 Flutter 客户端运行在调试模式下,则为 True。 注意: 此属性为只读。 |
wasm | bool | False | 如果应用运行在 WebAssembly(WASM)模式下,则为 True。 注意: 此属性为只读。 |
test | bool | False | 如果应用运行在测试模式下,则为 True。 注意: 此属性为只读。 |
multi_view | bool | False | 如果应用以多视图支持方式运行,则为 True。 注意: 此属性为只读。 |
pyodide | bool | False | 如果应用运行在 Pyodide(WebAssembly)模式下,则为 True。 注意: 此属性为只读。 |
platform_brightness | Optional[Brightness] | None | 宿主平台当前的亮度模式。 注意: 此属性为只读。 |
client_ip | Optional[str] | None | 已连接用户的 IP 地址。 注意: 此属性仅用于 Web 且为只读。 |
client_user_agent | Optional[str] | None | 已连接用户的浏览器详细信息。 注意: 此属性仅用于 Web 且为只读。 |
platform | Optional[PagePlatform] | None | 应用所运行的操作系统。 |
fonts | Optional[dict[str, str]] | None | 定义应用中要使用的自定义字体。 值是一个字典,其中键表示用于引用的字体族名称,值为:- Key:用于引用的字体族名称。- Value:字体来源,可以是绝对 URL,也可以是本地静态资源的相对路径。支持以下字体文件格式:.ttc、.ttf 和 .otf。 用法示例见此处。 |
views | list[View] | [View()]() | 页面管理的视图列表。 每个 View 代表应用中一个不同的导航状态或屏幕。 列表中的第一个视图默认被视为活动视图。 |
theme_mode | Optional[ThemeMode] | ThemeMode.SYSTEM | 页面的主题模式。 |
theme | Optional['Theme'] | None | 在浅色主题模式下自定义应用的主题。目前,主题只能从「种子」颜色自动生成。例如,从绿色生成浅色主题。 |
dark_theme | Optional['Theme'] | None | 在深色主题模式下自定义应用的主题。 |
theme_animation_style | Optional[AnimationStyle] | None | 覆盖应用主题更改时(例如 theme_mode 在浅色与深色之间切换时)使用的默认动画样式。 提示: 使用 no_animation 可完全禁用主题过渡。 |
locale_configuration | Optional[LocaleConfiguration] | None | 配置支持的语言区域和当前语言区域。 |
show_semantics_debugger | bool | False | 是否开启一个叠加层,显示框架报告的辅助功能(accessibility)信息。 |
title | Optional[str] | None | 页面或窗口标题。 |
enable_screenshots | bool | False | 允许通过 take_screenshot 方法对整页截图。 |
media | PageMediaData | PageMediaData(padding=Padding.zero()() | 页面或窗口当前的环境度量信息。 每当平台窗口或布局发生变化时(例如旋转设备、调整浏览器窗口大小,或调整键盘、安全区域等系统 UI 元素),此数据都会更新。 |
width | Optional[Number] | None | 页面的逻辑像素宽度。 注意: - 此属性为只读。 - 在桌面端运行 Flet 应用时,要获取或设置包含窗口装饰(例如标题栏和边框)的完整窗口高度,请改用 window 的 width 属性。 |
height | Optional[Number] | None | 页面的逻辑像素高度。 注意: - 此属性为只读。 - 在桌面端运行 Flet 应用时,要获取或设置包含窗口装饰(例如标题栏和边框)的完整窗口高度,请改用 window 的 height 属性。 |
adaptive | Optional[bool] | None | 启用平台特定渲染,或从父控件继承自适应能力。 |
expand | Annotated[Optional[Union[bool, int]], V.instance_of((bool, int))] | None | 指定此控件是否/如何扩展以填满父布局中的可用空间。 更多信息见此处。 注意: 仅当此控件的直接父级是以下控件或其子类时才生效:Column、Row、View、Page。 抛出异常: ValueError:如果它不是 bool 或 int 类型。 |
expand_loose | bool | False | 允许控件在主轴方向有可用空间时扩展,但不要求它填满所有可用空间。 更多信息见此处。 注意: 如果 expand_loose 为 True,则仅在以下条件满足时才生效: - expand 不为 None,且 - 此控件的直接父级是以下控件或其子类之一:Column、Row、View、Page。 |
col | ResponsiveNumber | 12 | 如果此控件的父级是 ResponsiveRow,则此属性决定该控件在屏幕上跨越多少虚拟列。 可以是一个数字,也可以是一个按断点配置不同值的字典,例如 col={"sm": 6}。 值为 0 时会在该断点隐藏控件,因此它不会占用父级 ResponsiveRow 中的任何列。 此控件默认跨越 12 个虚拟列。 | 断点 | 尺寸 | |---|---| | xs | <576px | | sm | ≥576px | | md | ≥768px | | lg | ≥992px | | xl | ≥1200px | | xxl | ≥1400px | |
opacity | Annotated[Number, V.between(0.0, 1.0)] | 1.0 | 定义控件的透明度。 取值范围从 0.0(完全透明)到 1.0(完全不透明,无任何透明感)。 抛出异常: ValueError:如果它不在 0.0 到 1.0(含)之间。 |
tooltip | Optional[TooltipValue] | None | 鼠标悬停在此控件上时显示的工具提示。 |
badge | Optional[BadgeValue] | None | 显示在此控件顶部的徽章。 |
visible | bool | True | 每个控件都有 visible 属性,默认为 True —— 控件会渲染在页面上。将 visible 设为 False 会彻底阻止控件(及其所有子控件,如果有)渲染到页面画布上。隐藏的控件无法通过键盘或鼠标获得焦点或选中,也不会触发任何事件。 |
disabled | bool | False | 每个控件都有 disabled 属性,默认为 False —— 控件及其所有子控件都处于启用状态。 注意: 此属性的值会递归向下传播到所有子控件。 示例: 例如,如果你有一个包含多个输入控件的表单,可以通过禁用容器来一并禁用它们: python ft.Column( disabled = True, controls=[ ft.TextField(), ft.TextField() ] ) |
rtl | bool | False | 控件的文本方向是否为从右到左(RTL)。 |
data | Any | skip_ | 任意类型的自定义数据。 |
key | Optional['KeyValue'] | None | 用于在更新之间保持控件标识稳定的键。 |
只读属性
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
app_visible | bool | — | 应用窗口(或浏览器标签页)当前是否可见。 由 on_app_lifecycle_state_change 驱动:状态为 HIDE 或 PAUSE 时为 False,否则为 True。与控件级别的 visible 属性不同,后者隐藏的是页面本身。 |
session | 'Session' | — | 此页面所属的会话。 |
query | QueryString | — | 当前页面的查询参数。 |
url | Optional[str] | — | 当前页面的 URL。 |
name | str | — | 当前页面的名称。 |
loop | asyncio.AbstractEventLoop | — | 当前页面的事件循环。 |
executor | Optional[ThreadPoolExecutor] | — | 当前页面的执行器。 |
auth | 'Optional[Authorization]' | — | 当前的授权上下文;如果用户未授权,则为 None。 |
pubsub | 'PubSubClient' | — | 当前页面的 PubSub 客户端。 |
overlay | list[BaseControl] | — | 渲染在页面内容之上的叠加控件列表。 |
controls | list[BaseControl] | — | 此页面所显示的根视图内容控件。 |
appbar | 'Union[AppBar, CupertinoAppBar, None]' | — | 获取或设置视图的顶部应用栏(AppBar 或 CupertinoAppBar)。 应用栏通常显示页面标题以及诸如导航图标、菜单或其他交互元素之类的可选操作。 |
bottom_appbar | Optional[BottomAppBar] | — | 显示在根视图底部的底部应用栏。 |
navigation_bar | 'Optional[Union[NavigationBar, CupertinoNavigationBar]]' | — | 根视图的底部导航栏。 |
drawer | Optional[NavigationDrawer] | — | 从前缘(leading edge)打开的导航抽屉。 |
end_drawer | Optional[NavigationDrawer] | — | 从后缘(trailing edge)打开的导航抽屉。 |
decoration | Optional[BoxDecoration] | — | 根视图容器的背景装饰。 |
foreground_decoration | Optional[BoxDecoration] | — | 绘制在根视图内容之上的前景装饰。 |
floating_action_button | Optional[FloatingActionButton] | — | 为根视图显示的悬浮操作按钮。 |
floating_action_button_location | Optional[Union[FloatingActionButtonLocation, OffsetValue]] | — | 悬浮操作按钮在根视图中的位置。 |
horizontal_alignment | CrossAxisAlignment | — | 根视图子控件的水平对齐方式。 |
vertical_alignment | MainAxisAlignment | — | 根视图子控件的垂直对齐方式。 |
spacing | Number | — | 根视图子控件之间的默认间距。 |
padding | Optional[PaddingValue] | — | 根视图内容的内边距。 |
bgcolor | Optional[ColorValue] | — | 根视图的背景色。 |
scroll | Optional[Union[ScrollMode, Scrollbar]] | — | 根视图内容的滚动行为模式。 |
auto_scroll | bool | — | 根视图是否应在内容变化时自动滚动到末尾。 |
services | list[Service] | — | 附加到根视图生命周期的服务实例。 |
parent | Optional['BaseControl'] | — | 此控件的直接祖先(父级)。 默认为 None,只有在此控件被挂载(加入页面树)后才有值。 Page 控件(页面树的根)是个例外 —— 它的 parent 始终为 None。 |
page | 'Page' | — | 此控件所属的页面。 |
事件
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
on_platform_brightness_change | Optional[EventHandler[PlatformBrightnessChangeEvent]] | None | 应用宿主平台的亮度发生变化时调用。 |
on_locale_change | Optional[EventHandler[LocaleChangeEvent]] | None | 宿主平台的语言区域偏好/设置发生变化时调用。 例如,当用户更新设备语言设置或浏览器首选语言时。 |
on_app_lifecycle_state_change | Optional[EventHandler[AppLifecycleStateChangeEvent]] | None | 应用生命周期状态发生变化时调用。 |
on_route_change | Optional[EventHandler[RouteChangeEvent]] | None | 页面路由发生变化时调用,无论是以编程方式、通过编辑应用 URL,还是使用浏览器的后退/前进按钮。 |
on_view_pop | Optional[EventHandler[ViewPopEvent]] | None | 用户点击 AppBar 控件中自动生成的「返回」按钮时调用。 |
on_views_pop_until | Optional[EventHandler[ViewsPopUntilEvent]] | None | 当 pop_views_until 到达目标视图时调用。 事件携带调用方传入的结果值。 |
on_keyboard_event | Optional[EventHandler[KeyboardEvent]] | None | 按下键盘按键时调用。 |
on_connect | Optional[ControlEventHandler['Page']] | None | Web 用户(重新)连接到页面会话时调用。 首次打开应用页面时不会触发,但在页面刷新、或 Flet Web 客户端在计算机解锁后重新连接时会触发。此事件可用于检测 Web 用户何时变为「在线」。 |
on_disconnect | Optional[ControlEventHandler['Page']] | None | Web 用户断开与页面会话的连接时调用,即关闭浏览器标签页/窗口时。 |
on_close | Optional[ControlEventHandler['Page']] | None | 会话在配置的时间(默认 60 分钟)后过期时调用。 |
on_login | Optional[EventHandler[LoginEvent]] | None | OAuth 授权流程成功或失败时调用。 更多信息和示例见身份验证指南。 |
on_logout | Optional[ControlEventHandler['Page']] | None | 调用 page.logout() 后调用。 |
on_error | Optional[ControlEventHandler['Page']] | None | 发生未处理的异常时调用。 |
on_multi_view_add | Optional[EventHandler[MultiViewAddEvent]] | None | 创建新的多视图时调用。 事件载荷包含新视图的标识符以及打开该视图时传入的初始数据。 |
on_multi_view_remove | Optional[EventHandler[MultiViewRemoveEvent]] | None | 移除多视图时调用。 事件载荷包含被移除视图的标识符。 |
on_resize | Optional[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_change | Optional[EventHandler[PageMediaData]] | None | media 发生变化时调用。 |
方法
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
get_control | Optional[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 | — | — | 将此页面加入队列,以便延迟批量更新。 |
update | None | — | 将待处理的状态变更推送到客户端。 参数: *controls:要修补的特定控件。省略时,修补整个页面状态。 |
error | None | — | 向当前会话/客户端报告应用错误。 参数: message:要发送的错误消息。 |
before_event | — | — | — |
wait_until_visible | None | — | 挂起,直到应用窗口(或浏览器标签页)可见。 当已经可见时立即返回。在隐藏期间,客户端的渲染管线会暂停,因此一个不断推送帧的生产者循环只会堆积积压,在恢复时淹没客户端。在此类循环的顶部等待此方法会让生产者暂停,直到标签页返回: python while True: await page.wait_until_visible() await raw_image.render(produce_frame()) 流式控件(RawImage、MatplotlibChart)内部已经对发送加上了此门控。 |
run_task | Future[RetT] | — | 将 handler 协程作为新任务运行在与此页面关联的事件循环中。 |
run_thread | None | — | 将 handler 函数作为新线程运行在与此页面关联的执行器中。 |
push_route | None | — | 将新的导航路由推入浏览器历史栈。更改路由会触发 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:要添加到路由的额外查询字符串参数。 |
navigate | None | — | 导航到新的路由(同步便捷包装)。 等价于 asyncio.create_task(page.push_route(route, **kwargs))。在无法使用 await 的同步回调(例如 on_click)中使用它。 参数: route:新的导航路由。 **kwargs:要添加到路由的额外查询字符串参数。 |
pop_views_until | None | — | 从导航栈中弹出视图,直到找到具有给定 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_url | str | — | 为内置上传存储生成预签名上传 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 流程。 更多信息和示例见身份验证指南。 |
logout | None | — | 清除当前授权上下文。更多信息和示例见身份验证指南。 |
get_device_info | Optional[DeviceInfo] | — | 返回设备信息。 返回值: 当前平台的设备信息对象,如果不可用则为 None。 |
set_allowed_device_orientations | None | — | 在移动设备上运行时,限制应用允许的方向。 参数: 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。 |
add | None | — | 向页面添加控件。 示例: python page.add(ft.Text("Hello!"), ft.FilledButton("Button")) |
insert | None | — | 在 page.controls 列表的指定索引处插入控件。 |
remove | None | — | 从 page.controls 列表中移除指定的控件。 |
remove_at | None | — | 从 page.controls 列表的指定索引处移除控件。 |
clean | None | — | 移除所有根视图控件并向客户端发送更新。 |
scroll_to | None | — | 将滚动位置移动到绝对 offset、相对 delta,或跳转到具有指定 scroll_key 的控件。 方法详情和示例见 scroll_to。 |
show_dialog | None | — | 显示一个对话框并管理其关闭生命周期。 此方法将指定的 dialog 添加到活动对话框栈中,并在页面上渲染它。对话框的 on_dismiss 处理器会被临时包装,以确保对话框从栈中移除并适当地触发其关闭事件。 参数: dialog:要显示的对话框实例。必须尚未打开。 抛出异常: RuntimeError:如果指定的对话框已经打开。 |
pop_dialog | Optional[DialogControl] | — | 关闭最近打开的对话框。 此方法在活动对话框栈中搜索当前打开的最顶层对话框,将其标记为已关闭,更新其状态,并返回该已关闭的对话框。 返回值: 找到的已关闭对话框实例,否则为 None。 |
show_drawer | — | — | 显示抽屉。 抛出异常: ValueError:如果未定义 drawer。 |
close_drawer | — | — | 关闭抽屉。 |
show_end_drawer | — | — | 显示末端抽屉。 抛出异常: ValueError:如果未定义 end_drawer。 |
close_end_drawer | — | — | 关闭末端抽屉。 |
take_screenshot | bytes | — | 对整页(含叠加层)截图。 参数: pixel_ratio:所截截图的像素比。如果为 None,将使用设备特定的像素比。 delay:截图前的延迟。如果未指定,延迟为 20 毫秒。 返回值: PNG 格式的截图。 |
take_animation | list[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 始终来自框架触发的事件,所以当此方法运行时,通道在两端都已存在。 |