多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Flet ExpansionTileTheme 主题配置指南:用 Python 全局定制 ExpansionTile 外观

Flet ExpansionTileTheme 主题配置指南:用 Python 全局定制 ExpansionTile 外观 Flet ExpansionTileTheme 主题配置指南用 Python 全局定制 ExpansionTile 外观【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址: https://gitcode.com/gh_mirrors/fl/flet本篇指南聚焦 Flet 框架的主题系统组件flet.ExpansionTileTheme完整讲解其全部 13 个可配置属性、与ExpansionTile控件的属性覆盖关系、通过page.theme全局启用的方法并结合仓库源码Python 定义与 Flutter 解析链路说明底层实现原理。读完本篇你将能够在不逐个修改控件属性的前提下用一份主题配置统一定制应用中所有展开卡片ExpansionTile的颜色、形状、内边距与展开动画。ExpansionTileTheme 是什么ExpansionTile是 Flet 中的展开型列表控件——一个单行的ListTile带有一个可旋转的展开箭头点击后展开/收起下方的控制区。Flet 的主题体系为其提供了全局统一样式的入口ExpansionTileTheme。根据源码定义theme.py其作用被精确定义为Customizes the appearance of descendantflet.ExpansionTilecontrols.即为所有后代ExpansionTile控件定制外观。它不是一个独立渲染的控件而是一份纯粹的样式描述数据由value装饰器标记的不可变值对象最终通过flet.Theme挂载到页面级主题上由 Flutter 引擎在渲染层解析生效。属性全景13 个可配置项ExpansionTileTheme的全部属性均为可选字段默认None未设置时表示不覆盖沿用 Flutter 的 Material 主题默认值。按职责可划分为三组颜色类ColorValue属性说明bgcolor覆盖ExpansionTile.bgcolor展开状态下整个 tile 的背景色collapsed_bgcolor覆盖ExpansionTile.collapsed_bgcolor收起状态下 tile 的背景色icon_color覆盖ExpansionTile.icon_color展开时箭头图标默认 trailing 边缘的颜色collapsed_icon_color覆盖ExpansionTile.collapsed_icon_color收起时箭头图标的颜色text_color覆盖ExpansionTile.text_color展开时标题文本颜色collapsed_text_color覆盖ExpansionTile.collapsed_text_color收起时标题文本颜色颜色值类型为ColorValue支持 Flet 的颜色字符串如blue、#FF5733或flet.Colors常量。形状与裁剪类属性说明shape覆盖ExpansionTile.shape展开状态下 tile 的边框/形状类型为OutlinedBorder如RoundedRectangleBorder、StadiumBorder等collapsed_shape覆盖ExpansionTile.collapsed_shape收起状态下 tile 的边框/形状clip_behavior覆盖ExpansionTile.clip_behavior内容超出边界时的裁剪方式类型为ClipBehavior布局与动画类属性说明tile_padding覆盖ExpansionTile.tile_paddingtile 内边距作用于 leading、title、subtitle、trailing不含展开内容区controls_padding覆盖ExpansionTile.controls_padding展开后控制区controls周围的内边距expanded_alignment覆盖ExpansionTile.expanded_alignment展开内容在 tile 内的对齐方式Alignmentanimation_style覆盖ExpansionTile.animation_style展开/收起动画的时长与曲线AnimationStyle属性默认值链主题如何与控件协作理解这套主题系统关键是掌握 Flet 的属性回退顺序。以ExpansionTile自身文档expansion_tile.py中的说明为准规则为三级回退优先使用控件实例上显式设置的属性值若为None回退到flet.ExpansionTileTheme中的对应项若主题中也未设置使用 Flutter 的内置默认值。源码中明确标注的默认值如下均来自ExpansionTile的 docstringcontrols_padding主题未设置时默认Padding.all(0)tile_padding主题未设置时默认Padding.symmetric(horizontal16.0)expanded_alignment主题未设置时默认Alignment.CENTERaffinity箭头位置主题未设置时默认TileAffinity.TRAILING即箭头出现在 tile 尾端。这种设计意味着ExpansionTileTheme提供的是全局兜底样式而单个控件仍可局部覆盖二者互不冲突。在应用中启用 ExpansionTileThemeExpansionTileTheme通过flet.Theme的expansion_tile_theme字段接入页面主题。该字段在 theme.py 中的定义为expansion_tile_theme: Optional[ExpansionTileTheme] None将其挂到页面上即可全局生效import flet as ft def main(page: ft.Page): page.theme ft.Theme( expansion_tile_themeft.ExpansionTileTheme( bgcolorblue, collapsed_bgcolorlightgrey, icon_colorwhite, collapsed_icon_colorgrey, text_colorwhite, collapsed_text_colorblack, tile_paddingft.Padding(left16, right16, top8, bottom8), controls_paddingft.Padding(left16, right16, top4, bottom4), expanded_alignmentft.Alignment.center_left, shapeft.RoundedRectangleBorder( radiusft.BorderRadius.all(8), sideft.BorderSide(colorblue, width2), ), collapsed_shapeft.RoundedRectangleBorder( radiusft.BorderRadius.all(8), sideft.BorderSide(colorgrey, width1), ), animation_styleft.AnimationStyle( durationft.Duration(milliseconds300), curveft.AnimationCurve.EASE_IN_OUT, ), ) ) page.add( ft.ExpansionTile( titleft.Text(账户), subtitleft.Text(管理个人资料与安全设置), controls[ ft.ListTile(titleft.Text(个人资料)), ft.ListTile(titleft.Text(安全设置)), ], ) ) ft.app(main)上述配置会让页面中所有未显式覆盖相关属性的ExpansionTile统一呈现为展开时蓝底白字、收起时灰底黑字、圆角边框、平滑的 300ms 缓动展开动画。需要说明的是page.theme是页面级全局主题若配合ThemeMode如page.theme_mode ft.ThemeMode.LIGHT使用同一份ExpansionTileTheme还会随亮/暗模式切换而生效。深浅色不同的场景可考虑将颜色分别写入bgcolor与collapsed_bgcolor形成展开/收起的状态差异这也是该组件两个状态色属性设计的主要用途。底层实现从 Python 到 Flutter 的解析链路ExpansionTileTheme并非 Flet 独有发明而是对 FlutterThemeData.expansionTileTheme的 Python 化封装。其数据流在仓库中清晰可查Python 端定义类定义于 theme.py每个属性用 docstring 标注Overrides the default value forflet.ExpansionTile.xxx即与控件同名属性一一对应传输序列化Theme对象中的expansion_tile_theme字段随页面主题一并序列化Flutter 客户端收到 JSON 中的expansion_tile_theme键Flutter 端解析在 theme.dart 的parseTheme中通过parseExpansionTileTheme(value?[expansion_tile_theme], theme)将 Flet 的字典数据转换为 Flutter 的ExpansionTileThemeData并写入ThemeData.expansionTileTheme渲染生效Flutter 的ExpansionTile组件在渲染时读取主题中的对应字段未设置处回退 Material 默认值。从源码结构看parseExpansionTileTheme与parseListTileTheme、parseSliderTheme等函数并列同属theme.dart中按控件类型组织的解析器族说明 Flet 对每一类 Material 主题子组件都采用Python 值对象 JSON 传递 Flutter 解析的同一模式。这也解释了为什么ExpansionTileTheme的所有属性都是可选的None值在传输层被省略Flutter 端仅对收到的键做copyWith未收到的键天然保留默认行为。相关资源主题类完整定义与全部属性sdk/python/packages/flet/src/flet/controls/theme.pyExpansionTileTheme位于第 2462 行Theme.expansion_tile_theme位于第 3410 行ExpansionTile控件属性及默认值说明expansion_tile.pyFlutter 端主题解析入口theme.dart主题相关类型参考Theme、AnimationStyle、OutlinedBorder、ClipBehavior【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址: https://gitcode.com/gh_mirrors/fl/flet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表