- 前端
- 跨平台
- 桌面应用
- 移动开发
【免费下载链接】flet
Build realtime web, mobile and desktop apps in Python only. No frontend experience required.
导读
CupertinoDatePickerDateOrder是 Flet 框架中用于控制 iOS 风格日期选择器CupertinoDatePicker内部列排列顺序的枚举类型。本文以官方文档页 cupertinodatepickerdateorder.md 为骨架,结合 cupertino_date_picker.py 的源码实现与官方 showcase 示例,完整讲解该枚举的四个取值、在日期选择器中的配置方法、与date_picker_mode的相互作用,以及 Python 层到 Flutter 原生层的传递机制。读完本文,你将能在自己的 Flet 应用中自由定制日期选择器的列顺序(如"日-月-年"或"年-月-日"),并对底层实现有清晰的认知。
一、什么是 CupertinoDatePickerDateOrder
在 iOS 系统中,日期选择器由多个滚动列(spinner column)组成。不同国家和地区习惯的日期书写顺序不同——美式习惯"月/日/年",欧式习惯"日/月/年",东亚则常用"年/月/日"。Flet 的CupertinoDatePicker是 iOS 风格日期选择器的移植控件,为了让开发者能够显式控制这些列的左右排列顺序,框架提供了CupertinoDatePickerDateOrder枚举。
从源码定义看,它是一个标准的 PythonEnum,声明于 cupertino_date_picker.py,并通过__init__.py中的__all__对外导出(见 sdk/python/packages/flet/src/flet/init.py),因此可以直接通过ft.CupertinoDatePickerDateOrder访问:
import flet as ft ft.CupertinoDatePickerDateOrder.DAY_MONTH_YEAR二、枚举的四个取值与完整对照表
CupertinoDatePickerDateOrder一共定义四个枚举成员,对应四种列排列方式,每种取值的序列化字符串分别是"dmy"、"mdy"、"ymd"、"ydm"(与 Flutter 原生CupertinoDatePickerDateOrder的取值一一对应):
| 枚举成员 | 底层字符串 | 从左到右的列顺序 | 示例显示效果 |
|---|---|---|---|
DAY_MONTH_YEAR | "dmy" | 日、月、年 | 12 \| March \| 1996 |
MONTH_DAY_YEAR | "mdy" | 月、日、年 | March \| 12 \| 1996 |
YEAR_MONTH_DAY | "ymd" | 年、月、日 | 1996 \| March \| 12 |
YEAR_DAY_MONTH | "ydm" | 年、日、月 | 1996 \| 12 \| March |
以上取值与示例均出自 cupertino_date_picker.py 中每个枚举成员的 docstring,是官方文档定义的权威说明。需要注意的是,这里的"月"列在显示时总是以完整英文月份名称呈现(例如March),这一点与CupertinoDatePicker的 DATE 模式保持一致。
三、在 CupertinoDatePicker 中配置 date_order
该枚举是CupertinoDatePicker控件date_order属性的取值类型。在 cupertino_date_picker.py 中,该属性定义如下:
date_order: Optional[CupertinoDatePickerDateOrder] = None """ The order in which the columns inside this picker are displayed. Note: The final order in which the columns are displayed is also influenced by the date_picker_mode. For example, if date_picker_mode is flet.CupertinoDatePickerMode.MONTH_YEAR both flet.CupertinoDatePickerDateOrder.DAY_MONTH_YEAR and flet.CupertinoDatePickerDateOrder.MONTH_DAY_YEAR will result in the month|year order. """关键信息:
- 默认值为
None:此时不显式指定顺序,列顺序由日期选择器自身的本地化(locale / 国际化)逻辑决定; - 仅对 DATE 模式有意义:正如源码 docstring 所说,该枚举"determines the order of the columns inside
CupertinoDatePickerin date mode"(决定 DATE 模式下列的排列顺序); - 枚举值只需按最自然的方式书写:例如想要"日-月-年"就传
ft.CupertinoDatePickerDateOrder.DAY_MONTH_YEAR。
最小使用示例:
import flet as ft from datetime import datetime def main(page: ft.Page): picker = ft.CupertinoDatePicker( date_picker_mode=ft.CupertinoDatePickerMode.DATE, date_order=ft.CupertinoDatePickerDateOrder.DAY_MONTH_YEAR, value=datetime(2024, 3, 12, 10, 0), ) page.show_dialog( ft.CupertinoBottomSheet( content=picker, height=216, padding=ft.Padding.only(top=6), ) ) ft.run(main)四、官方展示示例:一次预览四种排列
仓库的示例目录 cupertino_date_picker_date_order/showcase/main.py 提供了一个完整的、可独立运行的 showcase,它遍历枚举的所有成员,为每一种列顺序生成一张卡片,点击卡片上的 "Open picker" 按钮即可在CupertinoBottomSheet中弹出对应顺序的日期选择器。
该示例的核心是函数式遍历枚举的写法,值得在实际开发中复用:
import flet as ft from datetime import datetime def showcase_card(date_order: ft.CupertinoDatePickerDateOrder) -> ft.Container: def open_picker(_): picker = ft.CupertinoDatePicker( date_picker_mode=ft.CupertinoDatePickerMode.DATE, date_order=date_order, value=datetime(2024, 3, 12, 10, 0), ) page.show_dialog( ft.CupertinoBottomSheet( content=picker, height=216, padding=ft.Padding.only(top=6), ) ) return ft.Container( width=320, padding=12, border=ft.Border.all(1, ft.Colors.RED), border_radius=10, bgcolor=ft.Colors.SURFACE_CONTAINER_LOW, content=ft.Column( spacing=8, controls=[ ft.Text(date_order.name, weight=ft.FontWeight.BOLD), ft.Button( "Open picker", icon=ft.CupertinoIcons.CALENDAR, on_click=open_picker, ), ], ), ) page.add( ft.SafeArea( expand=True, content=ft.Column( controls=[ ft.Text("Open each variant in CupertinoBottomSheet."), ft.Row( wrap=True, spacing=12, expand=True, scroll=ft.ScrollMode.AUTO, alignment=ft.MainAxisAlignment.CENTER, controls=[ showcase_card(date_order) for date_order in ft.CupertinoDatePickerDateOrder ], ), ], ), ) )几个值得注意的细节:
- 遍历枚举:
for date_order in ft.CupertinoDatePickerDateOrder直接遍历枚举类即可获得全部四个成员,date_order.name输出成员名(如DAY_MONTH_YEAR)作为卡片标题; - 正确的承载容器:示例使用
page.show_dialog+CupertinoBottomSheet弹出选择器,并设置height=216配合item_extent默认值32.0(即每列条目高度为 32 逻辑像素),这正是 iOS 日期选择器典型的交互形式; - 初始值:
value=datetime(2024, 3, 12, 10, 0)明确指定了初始日期,便于观察不同列顺序下的展示差异。
运行该示例的方式与普通 Flet 应用一致:
python main.py五、date_order 与 date_picker_mode 的相互作用
date_order并非在所有模式下都生效,最终呈现的列顺序同时受date_picker_mode影响。CupertinoDatePickerMode同样定义在同文件 cupertino_date_picker.py 中,共有四种模式:
| 模式 | 底层字符串 | 显示的列 | 示例 |
|---|---|---|---|
TIME | "time" | 时、分、(可选)AM/PM | 4 \| 14 \| PM |
DATE | "date" | 月、日、年 | July \| 13 \| 2012 |
DATE_AND_TIME | "dateAndTime" | 星期、月、日 + 时、分、(可选)AM/PM | Fri Jul 13 \| 4 \| 14 \| PM |
MONTH_YEAR | "monthYear" | 月、年 | July \| 2012 |
源码 docstring 中明确给出了一个交互规则示例(cupertino_date_picker.py):当date_picker_mode为MONTH_YEAR时,无论传入DAY_MONTH_YEAR还是MONTH_DAY_YEAR,最终都会呈现month | year顺序——因为该模式下本来就只显示月和年两列,日期顺序无从谈起。同理,在TIME与DATE_AND_TIME模式下,时间部分的列顺序"subject to internationalization"(受国际化影响),date_order主要作用于日期部分的列。
实践建议:只有当你需要明确控制 DATE 模式下列的左右顺序(例如为了贴合特定地区用户的阅读习惯)时才需要设置date_order;其余场景保持默认None让系统根据 locale 自动决定通常更稳妥。若需要整页级本地化,可以配合CupertinoDatePicker的locale属性使用(源码见 cupertino_date_picker.py),但该 locale 必须受 Flutter 全局本地化委托支持,否则会被忽略。
六、从 Python 到 Flutter:date_order 的底层传递
Flet 的 Python 控件最终会渲染为 Flutter 原生控件。在 Dart 侧的 cupertino_date_picker.dart 中,CupertinoDatePicker的构建逻辑通过以下调用读取 Python 侧传入的date_order属性:
dateOrder: widget.control.getDatePickerDateOrder("date_order"),也就是说,Python 层的枚举成员在序列化时会转换为对应的底层字符串("dmy"/"mdy"/"ymd"/"ydm"),Dart 侧的getDatePickerDateOrder再将其解析为 Flutter 原生的CupertinoDatePickerDateOrder枚举并交给CupertinoDatePicker渲染。整个调用链可以概括为:
Python 枚举成员(如 DAY_MONTH_YEAR) → 序列化为字符串 "dmy"(经协议通道下发) → Dart 端 getDatePickerDateOrder("date_order") 解析 → Flutter CupertinoDatePicker.dateOrder 渲染列顺序从源码结构看,getDatePickerDateOrder是 Flet 控制协议中负责"字符串 ↔ Dart 枚举"映射的解析器方法,其输入就是控件 JSON 属性中的date_order字段。理解这一链路有助于排查跨语言属性不生效的问题——例如传入一个枚举类之外的字符串值,就可能在 Dart 端解析失败并回退到默认行为。
七、小结
CupertinoDatePickerDateOrder虽然只是一个仅有四个成员的轻量枚举,却是定制 iOS 风格日期选择器体验的关键一环。本文要点回顾:
- 四个成员
DAY_MONTH_YEAR、MONTH_DAY_YEAR、YEAR_MONTH_DAY、YEAR_DAY_MONTH分别对应dmy、mdy、ymd、ydm四种列顺序; - 通过
CupertinoDatePicker.date_order属性传入,默认None时交由国际化逻辑决定; - 最终呈现顺序受
date_picker_mode约束,MONTH_YEAR等模式下date_order的实际效果会收窄; - 官方 showcase 示例 展示了遍历枚举、批量预览全部变体的标准写法,可直接复制运行。
若想深入了解日期选择器的其他能力(如first_date、last_date、minute_interval、show_day_of_week等参数及其校验规则),可继续阅读 cupertino_date_picker.py 的完整源码,以及 Flet 文档中 CupertinoDatePicker 控件说明。
- 前端
- 跨平台
- 桌面应用
- 移动开发
【免费下载链接】flet
Build realtime web, mobile and desktop apps in Python only. No frontend experience required.
相关推荐
Flet 中 CupertinoTimerPickerMode 枚举全解析:iOS 风格倒计时选择器的三种显示模式
Flet 中 CupertinoTimerPickerMode 枚举全解析:iOS 风格倒计时选择器的三种显示模式 flet.CupertinoTimerPic
前端跨平台桌面应用移动开发Flet CupertinoDatePicker 控件完全指南:iOS 风格日期与时间选择器
Flet CupertinoDatePicker 控件完全指南:iOS 风格日期与时间选择器 CupertinoDatePicker 是 Flet 中复刻 iO
前端跨平台桌面应用移动开发Flet CupertinoPicker 完全指南:用 Python 构建 iOS 风格滚轮选择器
Flet CupertinoPicker 完全指南:用 Python 构建 iOS 风格滚轮选择器 CupertinoPicker 是 Flet 提供的一款 i
前端跨平台桌面应用移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考