Flet 的 CupertinoDatePickerDateOrder 枚举:定制 iOS 风格日期选择器的列顺序
2026/9/24 3:51:08 网站建设 项目流程
  • 前端
  • 跨平台
  • 桌面应用
  • 移动开发

【免费下载链接】flet

Build realtime web, mobile and desktop apps in Python only. No frontend experience required.

项目地址:https://gitcode.com/gh_mirrors/fl/flet
点击查看免费下载

导读

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 insideCupertinoDatePickerin 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 ], ), ], ), ) )

几个值得注意的细节:

  1. 遍历枚举for date_order in ft.CupertinoDatePickerDateOrder直接遍历枚举类即可获得全部四个成员,date_order.name输出成员名(如DAY_MONTH_YEAR)作为卡片标题;
  2. 正确的承载容器:示例使用page.show_dialog+CupertinoBottomSheet弹出选择器,并设置height=216配合item_extent默认值32.0(即每列条目高度为 32 逻辑像素),这正是 iOS 日期选择器典型的交互形式;
  3. 初始值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/PM4 \| 14 \| PM
DATE"date"月、日、年July \| 13 \| 2012
DATE_AND_TIME"dateAndTime"星期、月、日 + 时、分、(可选)AM/PMFri Jul 13 \| 4 \| 14 \| PM
MONTH_YEAR"monthYear"月、年July \| 2012

源码 docstring 中明确给出了一个交互规则示例(cupertino_date_picker.py):当date_picker_modeMONTH_YEAR时,无论传入DAY_MONTH_YEAR还是MONTH_DAY_YEAR,最终都会呈现month | year顺序——因为该模式下本来就只显示月和年两列,日期顺序无从谈起。同理,在TIMEDATE_AND_TIME模式下,时间部分的列顺序"subject to internationalization"(受国际化影响),date_order主要作用于日期部分的列。

实践建议:只有当你需要明确控制 DATE 模式下列的左右顺序(例如为了贴合特定地区用户的阅读习惯)时才需要设置date_order;其余场景保持默认None让系统根据 locale 自动决定通常更稳妥。若需要整页级本地化,可以配合CupertinoDatePickerlocale属性使用(源码见 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_YEARMONTH_DAY_YEARYEAR_MONTH_DAYYEAR_DAY_MONTH分别对应dmymdyymdydm四种列顺序;
  • 通过CupertinoDatePicker.date_order属性传入,默认None时交由国际化逻辑决定;
  • 最终呈现顺序受date_picker_mode约束,MONTH_YEAR等模式下date_order的实际效果会收窄;
  • 官方 showcase 示例 展示了遍历枚举、批量预览全部变体的标准写法,可直接复制运行。

若想深入了解日期选择器的其他能力(如first_datelast_dateminute_intervalshow_day_of_week等参数及其校验规则),可继续阅读 cupertino_date_picker.py 的完整源码,以及 Flet 文档中 CupertinoDatePicker 控件说明。

  • 前端
  • 跨平台
  • 桌面应用
  • 移动开发

【免费下载链接】flet

Build realtime web, mobile and desktop apps in Python only. No frontend experience required.

项目地址:https://gitcode.com/gh_mirrors/fl/flet
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询