From 9505a2b5268c288d9d0e7559f531cb16d50ab6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=20Cai?= Date: Wed, 28 Oct 2026 16:30:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E9=94=AE=E7=9B=98=E9=81=BF=E8=AE=A9=E4=B8=8E=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=8C=BA=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../009-Feedback-ActionSheet/acceptance.md | 4 + .../009-Feedback-ActionSheet/plan.md | 4 + .../009-Feedback-ActionSheet/spec.md | 4 + .../010-Feedback-Dialog/acceptance.md | 10 + specs/components/010-Feedback-Dialog/plan.md | 6 + specs/components/010-Feedback-Dialog/spec.md | 1 + specs/components/010-Feedback-Dialog/tasks.md | 2 +- .../025-Input-DateTimePicker/acceptance.md | 4 + .../025-Input-DateTimePicker/spec.md | 4 + .../components/026-Input-Picker/acceptance.md | 4 + specs/components/026-Input-Picker/spec.md | 4 + .../example/assets/api/dialog_api.md | 2 +- ...-time-picker.DateTimePickerDateExample.txt | 1 + ...e-picker.DateTimePickerDateTimeExample.txt | 1 + ...ime-picker.DateTimePickerMinuteExample.txt | 1 + ...e-picker.DateTimePickerMonthDayExample.txt | 1 + ...time-picker.DateTimePickerMonthExample.txt | 1 + ...ime-picker.DateTimePickerSecondExample.txt | 1 + ...time-picker.DateTimePickerTitleExample.txt | 1 + ...-time-picker.DateTimePickerWeekExample.txt | 1 + ...cker.DateTimePickerWithoutTitleExample.txt | 1 + .../assets/code/picker.PickerAreaExample.txt | 1 + .../assets/code/picker.PickerBaseExample.txt | 1 + .../assets/code/picker.PickerTimeExample.txt | 1 + .../assets/code/picker.PickerTitleExample.txt | 1 + .../date_time_picker_date_example.dart | 1 + .../date_time_picker_date_time_example.dart | 1 + .../date_time_picker_minute_example.dart | 1 + .../date_time_picker_month_day_example.dart | 1 + .../date_time_picker_month_example.dart | 1 + .../date_time_picker_second_example.dart | 1 + .../date_time_picker_title_example.dart | 1 + .../date_time_picker_week_example.dart | 1 + ...ate_time_picker_without_title_example.dart | 1 + .../lib/page/picker/picker_area_example.dart | 1 + .../lib/page/picker/picker_base_example.dart | 1 + .../lib/page/picker/picker_time_example.dart | 1 + .../lib/page/picker/picker_title_example.dart | 1 + .../date_time_picker_demo_test.dart | 6 + .../picker/goldens/picker_safe_area_dark.png | Bin 0 -> 41637 bytes .../picker/goldens/picker_safe_area_light.png | Bin 0 -> 42469 bytes .../test/picker/picker_demo_golden_test.dart | 21 +- .../example/test/picker/picker_demo_test.dart | 9 + .../action_sheet/t_action_sheet_list.dart | 16 +- .../lib/src/components/dialog/t_dialog.dart | 27 ++- .../goldens/t_action_sheet_safe_area_dark.png | Bin 0 -> 5845 bytes .../t_action_sheet_safe_area_light.png | Bin 0 -> 5766 bytes .../t_action_sheet_list_test.dart | 32 +++ .../t_action_sheet_safe_area_golden_test.dart | 49 +++++ .../t_dialog_keyboard_landscape_dark.png | Bin 0 -> 10445 bytes .../t_dialog_keyboard_landscape_light.png | Bin 0 -> 10494 bytes .../t_dialog_keyboard_portrait_dark.png | Bin 0 -> 15360 bytes .../t_dialog_keyboard_portrait_light.png | Bin 0 -> 15750 bytes .../dialog/t_dialog_keyboard_golden_test.dart | 88 +++++++++ .../test/components/dialog/t_dialog_test.dart | 182 ++++++++++++++++++ .../tool/component_test_manifest.dart | 16 ++ tdesign-site/site/docs/faq.md | 4 + 57 files changed, 508 insertions(+), 17 deletions(-) create mode 100644 tdesign-component/example/test/picker/goldens/picker_safe_area_dark.png create mode 100644 tdesign-component/example/test/picker/goldens/picker_safe_area_light.png create mode 100644 tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_dark.png create mode 100644 tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_light.png create mode 100644 tdesign-component/test/components/action_sheet/t_action_sheet_safe_area_golden_test.dart create mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png create mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_light.png create mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_dark.png create mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png create mode 100644 tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart diff --git a/specs/components/009-Feedback-ActionSheet/acceptance.md b/specs/components/009-Feedback-ActionSheet/acceptance.md index fd1310736c..19c2671830 100644 --- a/specs/components/009-Feedback-ActionSheet/acceptance.md +++ b/specs/components/009-Feedback-ActionSheet/acceptance.md @@ -21,3 +21,7 @@ 未绑定唯一候选的结果不作为当前通过证明;旧命令与流水由Git历史追溯。 当前待办见 [tasks.md](./tasks.md);实际执行入口见[贡献规范](../../../CONTRIBUTING.md#组件测试与-ci-回归门禁)。清理不关闭未完成项。 + +## 2026-10-28 弹层安全区修复验证 + +列表组件在 showCancel 开关下的安全区实际高度回归、命令式入口及既有 Demo 检查通过;新增无取消按钮明暗两张 Linux Golden 精确通过。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 diff --git a/specs/components/009-Feedback-ActionSheet/plan.md b/specs/components/009-Feedback-ActionSheet/plan.md index aa0940d685..c5f04896da 100644 --- a/specs/components/009-Feedback-ActionSheet/plan.md +++ b/specs/components/009-Feedback-ActionSheet/plan.md @@ -21,3 +21,7 @@ fixed/paged/scroll 互斥布局各自持有有效参数,选择回调返回稳 4. 结果绑定候选、环境和必要证据,更新 acceptance.md;真实剩余工作只在 tasks.md 维护。 本次文档整理不执行上述实现或候选验收,不据旧命令流水推定当前检查通过。 + +## 底部安全区修复 + +将内部列表的安全区移出取消按钮。复用现有列表测试,比较显示/隐藏取消按钮时开启安全区所增加的实际高度;仅补明暗各一张无取消按钮的代表性 Golden,原公开 Demo 基线不刷新。 diff --git a/specs/components/009-Feedback-ActionSheet/spec.md b/specs/components/009-Feedback-ActionSheet/spec.md index a529d8d930..48ac6ed9f7 100644 --- a/specs/components/009-Feedback-ActionSheet/spec.md +++ b/specs/components/009-Feedback-ActionSheet/spec.md @@ -128,3 +128,7 @@ ActionSheet 当前 Demo 以自定义业务场景取代了官方小程序的公 ## Popup 关闭保留的间接影响 showList、showGrid 和 showGridSections 使用 Popup 默认 false 配置,随 Popup 关闭保留修复,内容 State 在关闭后保留,同句柄 open 可重开,所属 Navigator 卸载时释放;直接使用独立面板不涉及该会话缓存。三个入口未提供 destroyOnClose,不能直接配置 true。参数限制与通用资源风险在本站 ActionSheet FAQ 说明,并精准链接 Popup FAQ;完整生命周期风险见 [Popup Spec](../018-Feedback-Popup/spec.md#faq-展示与-actionsheet-间接影响)。本轮只补文档,不修改入口、默认值、回调或绑定规则。 + +## 底部安全区 + +内部列表的底部安全区由 `useSafeArea` 决定,不依赖 `showCancel`。命令式入口继续由 Popup 统一避让,内部列表关闭自身避让,避免重复留白;不改变公开入口默认值。 diff --git a/specs/components/010-Feedback-Dialog/acceptance.md b/specs/components/010-Feedback-Dialog/acceptance.md index 45bf8a9ec1..78bdb94467 100644 --- a/specs/components/010-Feedback-Dialog/acceptance.md +++ b/specs/components/010-Feedback-Dialog/acceptance.md @@ -1,5 +1,15 @@ # Dialog 验证范围与结论 +## 2026-10-28 安全区与键盘修复验收 + +本次独立修复基于 develop@5132a7d07e70be18c2e4185c32bf77ffccaee605,不包含发布分支的版本号调整。展示入口保持任意自定义 Widget 的有限高度约束,标准 TDialog 在可用高度不足时滚动,并通过 viewInsets 避让键盘。测试收敛为 useSafeArea 两种取值下的 Expanded 场景,单一内容同时包含 LayoutBuilder 与 ListView,验证键盘出现及收起恢复;另验证标准弹窗横屏滚动、Builder 包装及 TConfirmDialog,不重复组合全部自定义内容。 + +Flutter 3.32.0 / 3.47.8 下,相关组件与调度测试各 174 项、公开示例测试各 49 项通过,组件包严格静态分析无诊断。Linux Flutter 3.32.0 行覆盖率:Dialog 308/312(98.72%),ActionSheet 539/557(96.77%),均通过 95% 门槛。正式 API 生成及 57 份文档一致性、示例代码生成一致性检查通过。 + +Linux Flutter 3.32.0 下,116 项既有 Demo 视觉套件检查和 1 项共享 Dialog 视觉检查原样通过。仅新增 8 张 PNG:Dialog 横竖屏键盘区域 × 明暗主题 4 张、无取消按钮的 ActionSheet 底部安全区 2 张、Picker 代表入口底部安全区 2 张;生成后不带更新参数精确复跑通过。键盘图中的灰色区域为测试模拟,不代表真机输入法。既有 Golden 不更新、不放宽容差;DateTimePicker 复用 Picker 布局契约和既有视觉检查,不增加重复截图矩阵。 + +先前 Android 16 局部复测已验证 Expanded 输入内容的键盘避让、关闭按钮,以及标准 Dialog 横屏键盘下滚动确认;方向设置与示例竖屏锁定随后恢复。该记录来自准备阶段的同一生产实现,本次整理没有重新执行真机操作,不能视为最终 PR 全场景设备验收。iOS、全部输入法及全部 22 个 Dialog 入口未覆盖,远端 CI 待 PR 创建后核对。 + ## 证据边界 以下归纳原记录中保留的检查点,未重新执行验收。标识、SDK或日志未完整绑定的阶段仍无法独立复现,不能将不同阶段拼成当前候选通过;细节由Git历史追溯。 diff --git a/specs/components/010-Feedback-Dialog/plan.md b/specs/components/010-Feedback-Dialog/plan.md index 6034e18175..df9e585901 100644 --- a/specs/components/010-Feedback-Dialog/plan.md +++ b/specs/components/010-Feedback-Dialog/plan.md @@ -35,3 +35,9 @@ 补齐一/二/三个 action 的受限宽度、显式省略、显式样式和点击行为。保持全局文字隔离和显式样式优先;只修复验证确认的组件缺陷,不新增配置、不修改已有 Golden,不在 Spec 保存截图。固定高度与自定义复合内容仍由调用方提供可容纳的约束。 验证确认文字操作区在 2 倍缩放下仅有 40dp 可用文字高度,低于单行所需 48dp。用最小高度 56dp 和等分列的实际内容测量保留贴边双按钮等高布局;不通过 IntrinsicHeight 查询,继续支持 LayoutBuilder 自定义内容;复跑既有默认尺寸和 Golden,确认普通字号不变。 + +## 键盘与自定义内容兼容性 + +展示路由通过底部 viewInsets 调整可用区域,继续用 Center 向自定义内容提供有限高度;不在路由统一包裹滚动容器或按 Widget 类型分流。标准 TDialog 在高度约束不足时自行整体滚动,便捷封装与 Builder 包装获得相同行为,保留蒙层关闭。 + +测试仅保留三类根因:自定义 Expanded(同时包含 LayoutBuilder 与滚动列表)的有限约束及键盘恢复、标准 Dialog 键盘出现/收起和横屏操作可达、便捷封装与 Builder 包装。按独立职责切换 useSafeArea,不再交叉重复相同包装。现有无键盘 Golden 原样验证,仅新增竖屏键盘及横屏滚动到操作区的明暗四张基线。 diff --git a/specs/components/010-Feedback-Dialog/spec.md b/specs/components/010-Feedback-Dialog/spec.md index 4063618a7c..91b5df3331 100644 --- a/specs/components/010-Feedback-Dialog/spec.md +++ b/specs/components/010-Feedback-Dialog/spec.md @@ -24,6 +24,7 @@ Dialog 的核心弹层能力已存在,但默认顶边距和关闭按钮位置 - Dialog Example 页、Example 测试和自动生成代码片段。 - Dialog 使用 Flutter 标准模态路由承载居中自适应面板;不新增 Popup 公开 API,普通 Popup 的 240×240 默认契约保持不变。 +- Dialog 展示入口在键盘弹出时根据底部 viewInsets 在可用区域内居中,键盘收起后恢复;系统安全区开关独立生效。展示入口保留对子内容的有限高度约束,兼容自定义 Column + Expanded、LayoutBuilder 和滚动列表。标准 TDialog(包括便捷封装)在横屏等可用高度不足时自身支持整体滚动,操作区可达;滚动容器不得拦截面板外的蒙层点击。 - Dialog 保留现有构造与 `Future` 展示 API;仅增加可选的蒙层与关闭按钮返回值。 ### 不涉及 diff --git a/specs/components/010-Feedback-Dialog/tasks.md b/specs/components/010-Feedback-Dialog/tasks.md index 5408caeaa7..6521455f7f 100644 --- a/specs/components/010-Feedback-Dialog/tasks.md +++ b/specs/components/010-Feedback-Dialog/tasks.md @@ -8,7 +8,7 @@ ## 当前候选复核 -- [ ] 交付前核对最终提交与本地已验收增量的一致性,并完成远端 CI;本轮局部双版本测试和 Linux Golden 结论见 acceptance,设备验收未执行。 +- [ ] 交付前核对最终提交与本地已验收增量的一致性,并完成远端 CI;本轮局部双版本测试、Linux Golden 与 Android 局部设备结论见 acceptance;全部设备场景仍未覆盖。 已完成的开发步骤和旧 PR 创建过程已清理。原记录的远端 CI/Review 或设备连接状态不作为当前事实;相关事项需以实际证据核对,不能随文档整理关闭。 diff --git a/specs/components/025-Input-DateTimePicker/acceptance.md b/specs/components/025-Input-DateTimePicker/acceptance.md index 94f4dc6613..c28f2fd34c 100644 --- a/specs/components/025-Input-DateTimePicker/acceptance.md +++ b/specs/components/025-Input-DateTimePicker/acceptance.md @@ -37,3 +37,7 @@ 未绑定唯一候选的结果不作为当前通过证明;旧命令与流水由Git历史追溯。 当前待办见 [tasks.md](./tasks.md);实际执行入口见[贡献规范](../../../CONTRIBUTING.md#组件测试与-ci-回归门禁)。清理不关闭未完成项。 + +## 2026-10-28 弹层安全区修复验证 + +9 个公开示例显式开启安全区,现有确认流程测试增加底部安全区几何断言;既有视觉基线原样通过,未增加重复 Golden。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 diff --git a/specs/components/025-Input-DateTimePicker/spec.md b/specs/components/025-Input-DateTimePicker/spec.md index 0c6f4c38f3..dd433f1cd1 100644 --- a/specs/components/025-Input-DateTimePicker/spec.md +++ b/specs/components/025-Input-DateTimePicker/spec.md @@ -89,3 +89,7 @@ Picker 与 DateTimePicker 均在全部滚轮停止后恢复父级未接受的候 验收标准描述应满足的行为,不表示已执行或通过;执行范围与证据见 [acceptance.md](./acceptance.md),剩余事项只在 [tasks.md](./tasks.md) 维护。 跨组件配置职责见 [Theme 契约](../../engineering/048-Theme-configuration-contracts/spec.md),视觉方法见 [Golden 规范](../../engineering/044-Testing-golden-regression/spec.md)。 + +## 示例的安全区职责 + +九个日期时间选择器示例通过既有 `TPickerPopup.show(useSafeArea: true)` 显式避让底部系统区域;不改变组件或弹层公开默认值。弹层安全区布局与验证复用 [Picker 契约](../026-Input-Picker/spec.md#示例的安全区职责),在已有确认流程测试中补充底部位置断言,不重复建立相同布局的 Golden 矩阵。 diff --git a/specs/components/026-Input-Picker/acceptance.md b/specs/components/026-Input-Picker/acceptance.md index 20311f4540..dacb3a001a 100644 --- a/specs/components/026-Input-Picker/acceptance.md +++ b/specs/components/026-Input-Picker/acceptance.md @@ -39,3 +39,7 @@ 范围:选中/非选中/禁用状态字体、itemBuilder 上下文、布局包装、显式与局部样式以及滚轮布局。 最终候选、双版本功能与视觉结果集中记录在 [Theme 文字槽验收](../../engineering/048-Theme-configuration-contracts/acceptance.md#自定义文字槽统一验收2026-10-22),本组件不重复保存验证流水。既有设备及设计待办继续保留;本地结果不替代当前候选的远端 CI 或真机验证,截图不存 Spec。 + +## 2026-10-28 弹层安全区修复验证 + +5 个公开调用入口的现有布局测试补充底部安全区几何断言,代表性地区入口新增明暗两张 Linux Golden 精确通过。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 diff --git a/specs/components/026-Input-Picker/spec.md b/specs/components/026-Input-Picker/spec.md index 05bc4f9d33..11fa20980d 100644 --- a/specs/components/026-Input-Picker/spec.md +++ b/specs/components/026-Input-Picker/spec.md @@ -113,3 +113,7 @@ TPickerThemeData 的 height 必须为有限正数、itemCount 必须大于零( ## destroyOnClose 关闭生命周期 沿用 Popup 的关闭销毁策略,默认 false;true 关闭后释放,false 同一句柄在同一 Navigator 内 open 复用真实 State,所属 Navigator 卸载时自动清理。切换 Navigator 或重新 show 创建新 State。API 和 Controller 规则不变;默认 false 的释放时机改变、旧 true 的遮挡规则改变及长期保留风险见 [Popup Spec](../018-Feedback-Popup/spec.md#destroyonclose-关闭销毁修复独立交付)。Drawer 保持其 1.0.0 一次性关闭释放规则,不适用上述保留策略。 + +## 示例的安全区职责 + +公开选择器示例显式使用 `TPickerPopup.show(useSafeArea: true)`,让整个面板避让底部系统区域;保留标准头部与滚轮高度。`TPickerPopup` 的公开默认值仍为 false,业务可选择背景贴边并仅在内容内部处理安全区。复用已有几何测试覆盖五个示例入口,并仅增加明暗两张代表性安全区 Golden。 diff --git a/tdesign-component/example/assets/api/dialog_api.md b/tdesign-component/example/assets/api/dialog_api.md index 14fdcd79e0..33ce04956a 100644 --- a/tdesign-component/example/assets/api/dialog_api.md +++ b/tdesign-component/example/assets/api/dialog_api.md @@ -36,7 +36,7 @@ | --- | --- | --- | --- | --- | | context | BuildContext | - | 当前构建上下文,用于读取祖先配置。 | 是 | | dialog | Widget | - | 要放入模态路由的弹窗内容。 | 是 | -| barrierDismissible | bool | false | 默认为 false,点击蒙层不会关闭。 显式开启后,蒙层关闭成功时返回 `barrierResult`(默认 null); 操作按钮与内置关闭按钮分别返回各自配置的结果。 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 `barrierResult`。 | 否 | +| barrierDismissible | bool | false | 默认为 false,点击蒙层不会关闭。 显式开启后,蒙层关闭成功时返回 `barrierResult`(默认 null); 操作按钮与内置关闭按钮分别返回各自配置的结果。 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 `barrierResult`。 键盘弹出时,弹窗在键盘上方的可用区域内居中。 自定义内容保留当前可用区域的有限高度约束;标准 `TDialog` 在高度不足时 支持整体滚动,使操作区仍可使用。 | 否 | | barrierResult | T? | - | 开启蒙层关闭后,由蒙层成功关闭路由时返回的结果;默认 null。 | 否 | | barrierColor | Color? | - | 蒙层颜色;为空时使用 Colors.black54。 | 否 | | useRootNavigator | bool | true | 是否将弹窗推入根 Navigator,默认 true。 | 否 | diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateExample.txt index 5e428e9a96..13dadd3ad9 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateExample.txt @@ -81,6 +81,7 @@ class _DateTimePickerDateExampleState extends State { void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateTimeExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateTimeExample.txt index d309067aae..293943237d 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateTimeExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerDateTimeExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerDateTimeExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMinuteExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMinuteExample.txt index cc1155b675..2074ea51d7 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMinuteExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMinuteExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerMinuteExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthDayExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthDayExample.txt index 61cf58f294..3fd1d6718b 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthDayExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthDayExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerMonthDayExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthExample.txt index f404163313..2fec6f68d1 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerMonthExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerMonthExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerSecondExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerSecondExample.txt index d1def48b25..b51f4e3b53 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerSecondExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerSecondExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerSecondExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerTitleExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerTitleExample.txt index cd3f312729..8387f9e1f0 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerTitleExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerTitleExample.txt @@ -83,6 +83,7 @@ class _DateTimePickerTitleExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWeekExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWeekExample.txt index 302d0f6e99..c6159a3952 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWeekExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWeekExample.txt @@ -82,6 +82,7 @@ class _DateTimePickerWeekExampleState extends State { void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWithoutTitleExample.txt b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWithoutTitleExample.txt index dca8dd7f57..78eb62bef5 100644 --- a/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWithoutTitleExample.txt +++ b/tdesign-component/example/assets/code/date-time-picker.DateTimePickerWithoutTitleExample.txt @@ -84,6 +84,7 @@ class _DateTimePickerWithoutTitleExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/picker.PickerAreaExample.txt b/tdesign-component/example/assets/code/picker.PickerAreaExample.txt index 9d3b1bad67..e374bea5c1 100644 --- a/tdesign-component/example/assets/code/picker.PickerAreaExample.txt +++ b/tdesign-component/example/assets/code/picker.PickerAreaExample.txt @@ -81,6 +81,7 @@ class _PickerAreaExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/picker.PickerBaseExample.txt b/tdesign-component/example/assets/code/picker.PickerBaseExample.txt index 4de963ffe9..bace614de9 100644 --- a/tdesign-component/example/assets/code/picker.PickerBaseExample.txt +++ b/tdesign-component/example/assets/code/picker.PickerBaseExample.txt @@ -81,6 +81,7 @@ class _PickerBaseExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/picker.PickerTimeExample.txt b/tdesign-component/example/assets/code/picker.PickerTimeExample.txt index 893d66b8fb..bf1e14254a 100644 --- a/tdesign-component/example/assets/code/picker.PickerTimeExample.txt +++ b/tdesign-component/example/assets/code/picker.PickerTimeExample.txt @@ -81,6 +81,7 @@ class _PickerTimeExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/assets/code/picker.PickerTitleExample.txt b/tdesign-component/example/assets/code/picker.PickerTitleExample.txt index be46acec56..9bcea3b138 100644 --- a/tdesign-component/example/assets/code/picker.PickerTitleExample.txt +++ b/tdesign-component/example/assets/code/picker.PickerTitleExample.txt @@ -99,6 +99,7 @@ class _PickerTitleExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_example.dart index 379a6e0e34..92450b2024 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_example.dart @@ -84,6 +84,7 @@ class _DateTimePickerDateExampleState extends State { void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_time_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_time_example.dart index 3786b41114..8c6ea7be4d 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_time_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_date_time_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerDateTimeExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_minute_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_minute_example.dart index 6b141e4d53..8b68099c7f 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_minute_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_minute_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerMinuteExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_day_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_day_example.dart index 287f311b4e..f257af000c 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_day_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_day_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerMonthDayExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_example.dart index c325625804..7567a8f4b2 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_month_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerMonthExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_second_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_second_example.dart index 39a23652f8..cf47d61f78 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_second_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_second_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerSecondExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_title_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_title_example.dart index 814daf6cee..35acfcb8a8 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_title_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_title_example.dart @@ -86,6 +86,7 @@ class _DateTimePickerTitleExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_week_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_week_example.dart index 5b9ec9a5c0..86742f36cd 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_week_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_week_example.dart @@ -85,6 +85,7 @@ class _DateTimePickerWeekExampleState extends State { void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_without_title_example.dart b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_without_title_example.dart index 9beb838333..0f58d5a4e4 100644 --- a/tdesign-component/example/lib/page/date_time_picker/date_time_picker_without_title_example.dart +++ b/tdesign-component/example/lib/page/date_time_picker/date_time_picker_without_title_example.dart @@ -87,6 +87,7 @@ class _DateTimePickerWithoutTitleExampleState void showPicker() { var draft = value; TPickerPopup.show( + useSafeArea: true, context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/picker/picker_area_example.dart b/tdesign-component/example/lib/page/picker/picker_area_example.dart index f8e6a16b25..61526642fd 100644 --- a/tdesign-component/example/lib/page/picker/picker_area_example.dart +++ b/tdesign-component/example/lib/page/picker/picker_area_example.dart @@ -84,6 +84,7 @@ class _PickerAreaExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/picker/picker_base_example.dart b/tdesign-component/example/lib/page/picker/picker_base_example.dart index ed57797c82..e5ab774493 100644 --- a/tdesign-component/example/lib/page/picker/picker_base_example.dart +++ b/tdesign-component/example/lib/page/picker/picker_base_example.dart @@ -84,6 +84,7 @@ class _PickerBaseExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/picker/picker_time_example.dart b/tdesign-component/example/lib/page/picker/picker_time_example.dart index 9deef722e3..81e3be8b43 100644 --- a/tdesign-component/example/lib/page/picker/picker_time_example.dart +++ b/tdesign-component/example/lib/page/picker/picker_time_example.dart @@ -84,6 +84,7 @@ class _PickerTimeExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/lib/page/picker/picker_title_example.dart b/tdesign-component/example/lib/page/picker/picker_title_example.dart index 1e801e1dbc..6e6e63fdbd 100644 --- a/tdesign-component/example/lib/page/picker/picker_title_example.dart +++ b/tdesign-component/example/lib/page/picker/picker_title_example.dart @@ -102,6 +102,7 @@ class _PickerTitleExampleState extends State { }) { var draft = List.of(value); TPickerPopup.show( + useSafeArea: true, Navigator.of(context).context, headerBuilder: (_, close) => TPopupHeader( cancelButton: TToolbarPressable( diff --git a/tdesign-component/example/test/date_time_picker/date_time_picker_demo_test.dart b/tdesign-component/example/test/date_time_picker/date_time_picker_demo_test.dart index 323b30b493..b08b8e7961 100644 --- a/tdesign-component/example/test/date_time_picker/date_time_picker_demo_test.dart +++ b/tdesign-component/example/test/date_time_picker/date_time_picker_demo_test.dart @@ -199,6 +199,8 @@ void main() { testWidgets('DateTimePicker popup commits only after confirm', ( tester, ) async { + tester.view.padding = const FakeViewPadding(bottom: 34); + addTearDown(tester.view.resetPadding); await pumpFullDemoPage( tester, dateTimePickerDemoPageTestSpec, @@ -211,6 +213,10 @@ void main() { await tester.pumpAndSettle(); final panel = find.byKey(const ValueKey('date-time-picker-month-panel')); expect(tester.getSize(panel).height, 200); + expect( + tester.getBottomLeft(panel).dy, + tester.view.physicalSize.height / tester.view.devicePixelRatio - 34, + ); tester.widget(panel).onChanged!( const TDateTimePickerValue(year: 2026, month: 8), ); diff --git a/tdesign-component/example/test/picker/goldens/picker_safe_area_dark.png b/tdesign-component/example/test/picker/goldens/picker_safe_area_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..75a0d7cde54c721ee8a73a914c4fa4b170d640b7 GIT binary patch literal 41637 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

+^V%B?Wla}~QElLuB) z2!lu=s$6Ocu5Ae5kyKTEU-)UEi|t~N>ig_N%YVk#+oG>Uka5<<=D+P_5Naw29p%%x zBR2PNuLB z6b%RjpIzSforJK;8-7`ioSzV!Gn5k1?9QZ_UUa%OqS*xhf%;uPbb$zsEpTYnkPHPF zO8ej@6&j|!TFU74Qq4Ia#iH`G+i2%a0(k4bvE}%qNrtrUfvi0bT903CW}#$^qY@x~ z#GesKm3lDi_sO4-fIdq}p&=q!l39s6x5;l2fr%U80g}oa1QA3saLAc>QByiu#h#ZrU)MlYM7S3c zkc7t9-hS+!ufR;DqH*CkM8G5qodWYEwD=PDFzS+)IzVr~RZ?!5gTN_7bypC+fbdJi zWd}5v3V>J|TKzyTVV%^HTbqS{_qh(YkfGwke=qGUUxFptOD~x#xo?lObPpJu)fA%i z`}55&f!TwABz7o_+yeJdh|1V?-hhkb`=g(8lSAbLPTyVeh=~4>ve$X=NVOlUsQxts z>XgGt=;1ND?cDyx#}#;4`h{M5;6&%~=%FI_7;#Msh$tf~l+azEeY)=XLOG$ZF!CDQ zE0DWcSc=yUHOM*%h^9oTUV_ik5+IhHvf`1hkX`pg$qODVix9 z`~FiA?R6ia;z18grTJy*ip+m@d#U_%MxxhVsH)?LAr#%iy%k3Ap_PLF)6SpwY3ZrtDGWz=9*1PkKO7DKS*X^rCu;!{%M?M7(;!#s$Ppdenqw&OEs87pA_O?T*3QNWdr zPi-wBXmC)mVZzG0!kMmMNG%}3yAWg9R`yqZJ{PL$Q$||J&tuTWp!mhvvmG;Q(OvIz z;;&1iZX9v!*M5?LT82_WvT3nvQw_4$6XNL9vHcd$o?3H~SrH0gQ)a7<`CY-^qct7w z*ueh<=LCFH$gq+Iu}n+x02}gqQV9%EfOAVOA>-@n>Yzq@;NTn1-%FBZkyUZ}%sc28 z>);*BqpG zzwK+Ye&fbEqr3@eQLZ5Cm_R7cNq3vERxfg{FkDTo=`U-}(`Sx$+}JPlB3}hHh12@@ z8JdyEY_z2j##;}5Y*$Q~jNhhChf%s&tX49xvoh3pp> zW`ZDtSb$B3{YMK<#-G{U@xL9BVnUAaMHGN#Jv}Bd37b#MlhO`CGHkA>iHD#>P@|&x zLtTdc1B)LyY#3olhg=&Vj138bOo@&HtrY`o-IU8a zv?5D>x*hW{L2+4DecbXpV3AKE71Avb-=q9=2Wc zazV z??Wgw_I3s18mfrUWQAjr=UK9xW*Tkd^}e77l`bNv;YIUsKtA1%PYt}*aY!EUTzoKt zjNlZ*kYRHYeF;(RL%8!5oGgN!5JCAt)vo|qR@?D2AysUxIeC=fP&n<;rk(dpN9t}= z+M+g*(|+0{ar8Xmtawiov>&i5bpF3^b8&qREH^Efs1}y;Dj>NfO!PO5J-K8lbUnV>>N2P;Ye&PzkN{8%gM>t~xZbWE-`Z`t2ceqh-?KGw~=uu+2bQ#ijVMv&n?Ax?4>QFa%+M=$vJ0yMghk~L&8cm}u3W(Dz>dN4O$TT{V%Ye_U1ONu;VzcGNIgh?OvSjv)*VIKa*;z@c zTjJxfX8!Eip5jbJU1tLMnUAH4}n z-=eqdIst_V9Q@6@92%7*D5ukk=98Cq`{Q5#5y3!Nlf~fsIOZ_N*zfO6LN%*bt@`ac z`F#H3rAy6ep_QpP-w$iEhd=Kh7~s(ONC883Qrn+jb~Trhzy=b!7_rI$_sNygo@+9v zswyiFXlt(ry7lBs;J1_iV4+%k|Ht5rfA@oq)Qru*M{1_xsi(&w!dm0mk#G3&-p>kW zxi~zjQ!VNGF9bzJ3QlRHS20(^XRJ7r+Yp!S3j;iC?|!L*Yjjd|O`r8m z&N;l>eD+8?##s|Mk5xoh;?b}`-n~Dt=uRoLS{Vgkf3Y2hE~O>!I(?=&RFsvm(=Iy^ z+xLU?QKkB-ssNE1^wr_~-&cSTmXFOm%FpjO9=`}naQ%;5lpdrPK<`Sy5;$@E_~qK# zBdFDJNU{HTq4!#2Wgj*q&bGkGzN_43%6@hn^`6Ypw$%dLx6|Og&S%95v#dEfZ>i=Y zgmvZ;zTFyqUTEquTqM9?v{QVYcJ1UCgjjJ0&m} zFc`NJH@=o^ZsD?HAq+}2P`djPE1ZtJ!hg2k=?g%5}6HERmy;T zS=1YeALyD2-?QXfkWP{o3$)0ATO0iV7GaFAU#c~yq?A-*@-Ea3YeSVVb{)~w`}~jI zu)HOEy6PURfPW?L!fl3Nynyukq7YZJGn(VDEh|$|mB;_yzP%Q954;f6QRtE&_NADe zl0c9p$*n-{Kyq^6K6eV>XcZ%)cvDV+ePz7<4dUxyV}g2 z6B4>Vr+1xYY~R^{Z)K#2!%D%Gi}Vh>N$`JYYia-1RdybAG%$$eDM183P*MQY?+~2< z4BAKu$>xcPrezNo%$Kx>EJebi$sqy47cUe8#;1DL0%=D%-ENCJ!0XHDQ@hw1JFznG z*bee1MVZD3UwC35)6PW`#zDUDX8L3*g+k4INKN@Pl5!e9eE2K$b45*k{ri%V%ZVa- zPa&Ol%ReXHP*bC7Y~1asIWM)&NiQ-CS1S@>Ap#APk7fnp}|eyx{Uth#gRaeU}0r3d%4)kDEt=ah2aU?2C_xxC-(B zKs>tF;UVZb_z!_GKmd`N0#EBqfVGW{)RA5jTdn}$EvkA>(uzh-H~Vv^!tMDHL}Kmt zMD4o(@Ko)Gnf#LIf9UXI&_!br0DNL_MY}CR!UNT%IqBZNu#FDsKV6?|Pdnt4{{^3v zP+CCc?LU;v*L7$9ccQ9y??p#fEfK_{Jna7k+UH*t_wt6fv5yVy?+fHo@ZTYIZMByw HCRhF&Ct=Ic literal 0 HcmV?d00001 diff --git a/tdesign-component/example/test/picker/goldens/picker_safe_area_light.png b/tdesign-component/example/test/picker/goldens/picker_safe_area_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6f15c45ac4426ef17ffdc18af5631bb7719130 GIT binary patch literal 42469 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

u;*v z-nmAv;TKlmR;$A6_iR3CkCOY7_FL%5q%v{nsw zUopvOu7HsoCL%Z*&`e-El_a3mCwqqC09A!Yj<5hD=2Tld=tTC=^YFTX!$a8K5U#`s z>54|jxI@x>BAvsI4K1p_l;w;Ha4}KSf~;d5VU3BKyz-Zwf%JK}!+@8|c>X#=AgcK( zPZglYxW{B-H%etF5Xj&(Kr|~8EB8!)eDgjPDg9Trn0bbsFR*K5y^K>pbLs-esgFrKg#tZhqxI E0Z3;byZ`_I literal 0 HcmV?d00001 diff --git a/tdesign-component/example/test/picker/picker_demo_golden_test.dart b/tdesign-component/example/test/picker/picker_demo_golden_test.dart index c32245eeeb..2092dcf49a 100644 --- a/tdesign-component/example/test/picker/picker_demo_golden_test.dart +++ b/tdesign-component/example/test/picker/picker_demo_golden_test.dart @@ -24,6 +24,23 @@ void main() { } for (final mode in [ThemeMode.light, ThemeMode.dark]) { + testWidgets('picker ${mode.name} bottom safe area opened golden', ( + tester, + ) async { + tester.view.padding = const FakeViewPadding(bottom: 34); + addTearDown(tester.view.resetPadding); + await pumpDemoPageAtPhoneViewport(tester, pickerDemoPageTestSpec, mode); + final trigger = find.byKey(const ValueKey('picker-city-trigger')); + await tester.ensureVisible(trigger); + await tester.tap(trigger); + await tester.pumpAndSettle(); + await expectLater( + find.byType(Overlay), + matchesGoldenFile('goldens/picker_safe_area_${mode.name}.png'), + ); + await disposeDemoPage(tester); + }, tags: 'golden'); + testWidgets('picker linked changes ${mode.name} golden', (tester) async { await pumpDemoPageAtPhoneViewport(tester, pickerDemoPageTestSpec, mode); final trigger = find.byKey(const ValueKey('picker-area-trigger')); @@ -75,9 +92,7 @@ void main() { expect(tester.takeException(), isNull); await expectLater( find.byType(Overlay), - matchesGoldenFile( - 'goldens/picker_${id}_opened_${mode.name}.png', - ), + matchesGoldenFile('goldens/picker_${id}_opened_${mode.name}.png'), ); await disposeDemoPage(tester); }, tags: 'golden'); diff --git a/tdesign-component/example/test/picker/picker_demo_test.dart b/tdesign-component/example/test/picker/picker_demo_test.dart index 514b50f90a..434576c774 100644 --- a/tdesign-component/example/test/picker/picker_demo_test.dart +++ b/tdesign-component/example/test/picker/picker_demo_test.dart @@ -111,6 +111,8 @@ void main() { testWidgets('all Picker popups share the design geometry in ${mode.name}', ( tester, ) async { + tester.view.padding = const FakeViewPadding(bottom: 34); + addTearDown(tester.view.resetPadding); await pumpDemoPageAtPhoneViewport(tester, pickerDemoPageTestSpec, mode); const titles = { 'city': '选择地区', @@ -124,6 +126,13 @@ void main() { await tester.ensureVisible(trigger); await tester.tap(trigger); await tester.pumpAndSettle(); + expect( + tester + .getBottomLeft(find.byKey(ValueKey('picker-${entry.key}-panel'))) + .dy, + 778, + reason: '${entry.key} should avoid the bottom system inset', + ); final wheel = find.byType(ListWheelScrollView).first; expect(tester.getSize(wheel).height, 200, reason: entry.key); expect( diff --git a/tdesign-component/lib/src/components/action_sheet/t_action_sheet_list.dart b/tdesign-component/lib/src/components/action_sheet/t_action_sheet_list.dart index 6c283d4498..567e9b6ddd 100644 --- a/tdesign-component/lib/src/components/action_sheet/t_action_sheet_list.dart +++ b/tdesign-component/lib/src/components/action_sheet/t_action_sheet_list.dart @@ -149,6 +149,11 @@ class TActionSheetList extends StatelessWidget { if (subtitle?.isNotEmpty ?? false) _buildDescription(context), Flexible(child: _buildOptionsList(context)), if (showCancel) _buildCancelButton(context), + if (useSafeArea) + Container( + color: context.tTheme.bgColorContainer, + height: MediaQuery.paddingOf(context).bottom, + ), ], ), ), @@ -413,15 +418,6 @@ class TActionSheetList extends StatelessWidget { /// 构建取消按钮 Widget _buildCancelButton(BuildContext context) { - return Column( - children: [ - buildCancelButton(context, false, cancelText, onCancel), - if (useSafeArea) - Container( - color: context.tTheme.bgColorContainer, - height: MediaQuery.of(context).padding.bottom, - ), - ], - ); + return buildCancelButton(context, false, cancelText, onCancel); } } diff --git a/tdesign-component/lib/src/components/dialog/t_dialog.dart b/tdesign-component/lib/src/components/dialog/t_dialog.dart index bd86b3f717..e307ebbec3 100644 --- a/tdesign-component/lib/src/components/dialog/t_dialog.dart +++ b/tdesign-component/lib/src/components/dialog/t_dialog.dart @@ -182,6 +182,9 @@ class TDialog extends StatelessWidget { /// 操作按钮与内置关闭按钮分别返回各自配置的结果。 /// 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 /// 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 [barrierResult]。 + /// 键盘弹出时,弹窗在键盘上方的可用区域内居中。 + /// 自定义内容保留当前可用区域的有限高度约束;标准 [TDialog] 在高度不足时 + /// 支持整体滚动,使操作区仍可使用。 /// /// ## 返回值 /// 路由被弹出时完成并提供关闭结果;未携带结果时为 null,不等待关闭动画结束。 @@ -221,7 +224,14 @@ class TDialog extends StatelessWidget { transitionDuration: const Duration(milliseconds: 240), pageBuilder: (routeContext, animation, secondaryAnimation) { final centered = Center(child: dialog); - final content = useSafeArea ? SafeArea(child: centered) : centered; + final content = AnimatedPadding( + padding: EdgeInsets.only( + bottom: MediaQuery.viewInsetsOf(routeContext).bottom, + ), + duration: const Duration(milliseconds: 150), + curve: Curves.easeOut, + child: useSafeArea ? SafeArea(child: centered) : centered, + ); return capturedThemes.wrap(routeContext, content); }, transitionBuilder: @@ -311,7 +321,7 @@ class TDialog extends StatelessWidget { final effectiveActionSpacing = actionSpacing ?? token.spacer1; final closeButtonExtent = 24 + token.spacer + token.spacer2; - return Semantics( + final panel = Semantics( namesRoute: true, scopesRoute: true, label: semanticLabel, @@ -397,6 +407,19 @@ class TDialog extends StatelessWidget { ), ), ); + return LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxHeight >= effectiveMaxHeight) { + return panel; + } + // 仅标准面板在高度受限时整体滚动;展示入口继续为自定义内容 + // 提供有限高度,保留 Expanded 和 LayoutBuilder 的布局契约。 + return SingleChildScrollView( + hitTestBehavior: HitTestBehavior.deferToChild, + child: panel, + ); + }, + ); } } diff --git a/tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_dark.png b/tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8ea617d0c7e0ab75205b73eed884bf5bc3c49c GIT binary patch literal 5845 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 literal 0 HcmV?d00001 diff --git a/tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_light.png b/tdesign-component/test/components/action_sheet/goldens/t_action_sheet_safe_area_light.png new file mode 100644 index 0000000000000000000000000000000000000000..edb1c5f31760a0bf7062514ccc4195665701680f GIT binary patch literal 5766 zcmeHL=U-Djg^NL0)enWA7~gs zAPfj_Og+O4el1g29)W)hK1SO2AlM$h6>xIe=N{DL4EPH=V;>2DaNUGzsGInuuT2Gd zcEje|w)C%F(20yZFIps?@%#~A2R*!@rSS$!csK8WWlm5Qm z!A63BZ+^hsT!8Jiy<5oPngplcJUc|-bVF5{5`Fw=OUu8P)Ff|gqTf!7S7}E7d!e#Q zWivB;x}fm%Otj6jQ!kYiLi@${>M4r^jA2SC&g-CDCQ;fv?f3g8`L@lh+;-4NCCH_P zuFrNgp0h7gaeJwC!9mImJ(sw?cTPU3R-@%ki;E{*^hJ6|q45uuxQ|&hN%I-XH69SZ-r0D>RkdqNe`+H$@(l0-}8B;)PEi zVJP_7I#F9h4eAxF@*E_-A1vAn5uy8rw8Ns*QV)7sOYdZmagr}Cv&kYLVnWO3LPne3 z*7%cMQn2#)_DaWYR)XgJDTdh_Z!|Q->R|e7)(uk&jl6dDtgMS`3&wMk!cj_)DRlYi z8YQ~O!^S=bXsRN#sch`FhW9<$-$KbM7IvnMI>FF>@mpB~xTMhV&&T=?fsd>8nB#KT{a$O{Shy-{v-IlT=xks&? z7U^*3hE#E+*E&ta@E7sGNe>0y(99H;dtFBd&@MZ8URKt#lH?#TGo_>C6@}I+t;}9) z+;gxqkr1DIyE#08hYm){Kda!|E1>KMx>Z7##Tl7u3$+gQ3hkDv-#}@jc!Wd9_0h^>?>eq&J zRV%gN!;(72Q=o}V1AQ3LRhHxPlM5j57Wf&9dT5`$pK2K=>{DJa0S?ArAORQudO~x2Hjp34JtA0OS-`W zo6WH8RSm8gBUvOeykvRlBN$}==>4$*!ad6NGAJNR8%T0@eC)GCT~PIq&tv)^4Fikh z>^S5i|9JyqHRvXR-!kc?ZDhp9(aY%vN#LTdBnJk0N*^=_gV|F$!j)&=u_}A9K+aAH z_=QCM0+E_O(i8>5600|-5#TM)Tfn+nL{>4rd<)Y4|AYUv2su;r+utQw+1RdcmquTf zmXMV-t`DS)tPJK$24WE1;jov}K@x$GvO$bt&hCJY^t4xQL`|3O>QsF$Pg*2&jpZ4}=&dNTIFp2#5@qC5L zaAErf6AO!LOXP)C>n9c#VjdfXG_?e@3Zubz;T}%CY+$ZA;#VG?LgRcrD3VLsx)?Fz zuf5T5h@GhPC|#SZ)Is)SsuYa_)lyWn#L?C~DuNEYt?C0zss1bZHnPW10ec@7PQjvD70CDVdj$?0T$ro5}O#{xZjlIID|6W_H;AoZC z!VuO<=>xZ{R!U0B5_N}3W6IFPIXR@NV!qIyGUog_Jr8D-s6 zIjEBFYG3i=FT&6b+(`p6E)I=Kf-#@FVz5ZcL!+IkyDP-;FZpJr)+Op;%+5XO3J>-5 z5gA|LB(o1!Zrzh^*v~dHGTPl8)R(+{+bn{ee_;0Su!O`!5vXN_O9Cj`)5YNJ?QJ=) zc?}19dne*hLFyfkOg)rp2`DaUd#MwJzW6Nb(G~zbXBQyjD z94sYS*(M2xhK9Dbv^e!gyiOQ18xn`Z z9Um>Lk>*>Yk-4s;SSZqE6uahYwKh?)an}r4Tr5>tro_a=$}COz`1aWxxrIlJN0kR;=3b*uwZB{sXUk(7tCY9$ynP zj4^B`SNJH1DkΞw>xPtwuv{y2Iz1m_RQR23;8uVGi6T&|2TMfyfI&08En7($Xq> zV|GLW4!5^9nGc%l0kW>H?qP5SSovz2f|{C*b_|~v?H~zvgie)r%?m!$(z{RCd zD~7LNqQaE~C~0);vz?WaJ3Vb^oQU(^ubJM(#!Abqm)7s4dV70+eb&nQD;Jla04Pb7bEYRGakR`d)zi7D#}2WGkVinu&ePTP!hdn_ zQQz0s*CCbxV$f6f{#IT&3j;*VMyeC?pGkGI5a6zfug-B7FJ2sK2o7v*Z55Z7Hys}z zPf(GIEwQRKE5#jCgK-{?j(Gu;^^(DSeF7zLVNP>u?yrNLW!Jf;x5SZ>v_z@L*}vZp zcLFF%y=nW}eX7cEytzoGCqpT}ug_qOfFr<*-KT4aQ`KLNXf#RqbHA#6lRbz5IYTwr z5}^dzn$yYmHcTL6>81Me69}&$rQGuvvUxDXt>B+8on~1NvDaq2*Ify z1+V!x7dbhHKig@OSI3Pd&9Nr#?pV?xkan|Y&$5Bu{R-p{gihiJ-46rgzo^)DC5O&5 zpFe-5s~bI8@KpSMdUbWRWqm*eb#JZ6cWuIX_h&y)UR2wHO_k>-P*fo(u|FqbetupU z8o?oG=H!F{Vz9I&yFT{$KAr5h7TV<9r|wp`j_QG)GIVrwjOv9{UCFxS@9*!pIs3PW zs_G1%T1eg44v;lFML5wum2+3|cZ7ba@)kwi8F3z+Ack0W}8{+=-iG zPr7prV#7Uzx*}@#{#L$ThD@&tB^~vPRZ%$Tv+{sWv+>YkD?mZ3bOuUYt^GpU@pHkXD{hphbms(bKQ`U2~@mbqR zo7!>z?goLdI#JQdr{LWJlp6o_`S?J(vj0HN7R! z40}ZL5fCu}H9HWr*IhnGpi3euD%1A%_Q|%*;VBKlhp9kT0{3g9BAC1)v_a(@07l<8 z&)pQ#j*&wJZAW!{|L&~>0~l~@e90gpE!_)Wt*6Y$Zf$Mhuh=ylt}88g-t98C30|Te zcc?Gs9sJ<+*;{>FX*XR1mjxbf+wTb0n<)=cTAi%yh4-v^ zQ5Lx~ywrSGlS%2cLkcfQ|M-w_!gYA=C1T|R4JHOQ%lR`aBuBjSI{7F-~1&NXB0bklCb1H)thtJWem5``Tc9Gro?0^Q4)ls(PFl(7GPZf;Hy zd^MQyU*;zhhjse<`xU(xBVDyWiY`#zciQ1^GcpnN&s)e!p_&1sS*fG%2y?9cSnbzukW|3LPARm3&*h;vNdnt zzE$+w%mST`Xd?rat_eCQ*Isymm;UXytVg|cIRo!;X?pXE%Rp`vSb918_Vc3@9bTO1 z_XX|`w*&|r9MbbKMr+fx<|hZep+l7(Hlv?;wWBWgQ9D@#tQGs`4N+Gb>bYk^Fo5Ni2*ySwSO6~rkF#T|5e#HXYb z0ON*n9?YZrCLkTz%xpaEZEe~YE?l6m;HUc$PfHCgEHI$!C4rhEhbmmn-3Sdo9rnx5PBo{&p!3~0P+BRC-NiBqtI&sPoJA`a*Q~jQt2B7WbQHe>Y|TQ zO;ti*tpirBK?i_)fdkZcr^sr@s_Z3)a|mKvS~NZgs#ya`H@CD*1$H2}z&O9gI>&?1 zkSYs{0o;NG4Cn;dpGVH=Bf#ELzh8ZQJsHgDLU)d1WuL&x!}m9B(Yd*oc=hS_uC>*9 zyxc(sFD5Om4|Ki{$OoK8g+sTUju;piT>7$J`L0ii0|#A6_Rrt;14VD)M;BVx*Zkp-Us&~4<;oLFKCEVKX3FPw{>cZH!~lh6+~R|xXOBFZH`#Fsu40ol-4p({ET@x0@07vYOd-Y^uzsS54`}m8a zxVShJY=cZ6KK#y45if{4eY%?U;ht$ByP?C literal 0 HcmV?d00001 diff --git a/tdesign-component/test/components/action_sheet/t_action_sheet_list_test.dart b/tdesign-component/test/components/action_sheet/t_action_sheet_list_test.dart index b11930c9dc..78cc589c23 100644 --- a/tdesign-component/test/components/action_sheet/t_action_sheet_list_test.dart +++ b/tdesign-component/test/components/action_sheet/t_action_sheet_list_test.dart @@ -297,6 +297,38 @@ void main() { expect(find.byType(TActionSheetList), findsOneWidget); }); + testWidgets('底部安全区与取消按钮是否显示无关', (tester) async { + Future height({ + required bool showCancel, + required bool safe, + }) async { + await tester.pumpWidget( + wrap( + MediaQuery( + data: const MediaQueryData( + size: Size(800, 600), + padding: EdgeInsets.only(bottom: 34), + ), + child: Center( + child: TActionSheetList( + showCancel: showCancel, + useSafeArea: safe, + items: baseItems(), + ), + ), + ), + ), + ); + return tester.getSize(find.byType(TActionSheetList)).height; + } + + for (final showCancel in [false, true]) { + final withoutSafeArea = await height(showCancel: showCancel, safe: false); + final withSafeArea = await height(showCancel: showCancel, safe: true); + expect(withSafeArea - withoutSafeArea, 34); + } + }); + testWidgets('点击取消按钮触发 onCancel', (tester) async { var cancelled = false; await tester.pumpWidget( diff --git a/tdesign-component/test/components/action_sheet/t_action_sheet_safe_area_golden_test.dart b/tdesign-component/test/components/action_sheet/t_action_sheet_safe_area_golden_test.dart new file mode 100644 index 0000000000..c5f7b56156 --- /dev/null +++ b/tdesign-component/test/components/action_sheet/t_action_sheet_safe_area_golden_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tdesign_flutter/src/components/action_sheet/t_action_sheet_list.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; + +import '../../helpers/component_golden_fonts.dart'; + +void main() { + setUpAll(loadComponentGoldenFonts); + + for (final brightness in Brightness.values) { + testWidgets('ActionSheet without cancel safe area ${brightness.name}', ( + tester, + ) async { + tester.view.physicalSize = const Size(375, 250); + tester.view.devicePixelRatio = 1; + tester.view.padding = const FakeViewPadding(bottom: 34); + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.resetPadding); + await tester.pumpWidget( + RepaintBoundary( + key: const ValueKey('action-sheet-safe-area'), + child: MaterialApp( + theme: componentGoldenTheme(brightness), + home: const Scaffold( + body: Align( + alignment: Alignment.bottomCenter, + child: TActionSheetList( + showCancel: false, + items: [ + TActionSheetItem(value: 1, label: 'First action'), + TActionSheetItem(value: 2, label: 'Second action'), + ], + ), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + await expectLater( + find.byKey(const ValueKey('action-sheet-safe-area')), + matchesGoldenFile( + 'goldens/t_action_sheet_safe_area_${brightness.name}.png', + ), + ); + }); + } +} diff --git a/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png b/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..67bfa64d19439bfdf9b83778efa8436e577560ac GIT binary patch literal 10445 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 a4~F=?-RHS!2Y$s1fh(#j6hD0S=3fBk`T0ly literal 0 HcmV?d00001 diff --git a/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png b/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png new file mode 100644 index 0000000000000000000000000000000000000000..03281c03552d4b5a67e99e7b1bba035a4d70f8ac GIT binary patch literal 15750 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 x6uAXOUVkq~OPO z;EgnM?BUdSUGSEXVs)+m#4D#!v~Q2y`uZs_jV>Ls`zYja(uSR#osfi+R@dw8g@p)b zbPHPhYB@~0RX3+SQyezg4@RTW$W~%P%Umzh9H|%6jeVGdsWS#~7qpPKw6j<7VE(;~ z?7`X3$7g;$H9K+b!Z|%L1s-nh9EAhNVyj^K6}y8nCFDhR_Pj+a+d9y!=?S9dVj zL?wSW`3mBc8ro)q-5lZs8+HYmI~B6uf%jORtUfH7m~d_1eHJ0mxLqzn?F6$syRTI$ z9Y*!V^5I!&TAY+0OBsYoe>#{ML}TM{CgjHU?(X5FeiRx^D4Uulr|d0k@$J4lvVUni zN+Fh;gP@p+H%1ue*-LmxR)o2e^vgMGua!27kCFo|N3L=kcg%d+ z!VB`^;W3LuQU62NjH2gZ`EMPsfRX)w|N0LD{tpBG-%V-gyeE&=em^?3hXvoIhCo%d KRZ5kfzWi@wxH7{4 literal 0 HcmV?d00001 diff --git a/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart b/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart new file mode 100644 index 0000000000..64f9f6670a --- /dev/null +++ b/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart @@ -0,0 +1,88 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; + +import '../../helpers/component_golden_fonts.dart'; + +void main() { + setUpAll(loadComponentGoldenFonts); + + for (final brightness in Brightness.values) { + for (final landscape in [false, true]) { + final direction = landscape ? 'landscape' : 'portrait'; + testWidgets('Dialog keyboard $direction ${brightness.name}', ( + tester, + ) async { + tester.view.physicalSize = landscape + ? const Size(812, 375) + : const Size(375, 812); + tester.view.devicePixelRatio = 1; + tester.view.padding = FakeViewPadding(top: landscape ? 46 : 24); + final keyboardHeight = landscape ? 248.0 : 300.0; + tester.view.viewInsets = FakeViewPadding(bottom: keyboardHeight); + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.resetPadding); + addTearDown(tester.view.resetViewInsets); + + await tester.pumpWidget( + RepaintBoundary( + key: const ValueKey('keyboard-dialog'), + child: MaterialApp( + theme: componentGoldenTheme(brightness), + builder: (context, child) => Stack( + children: [ + child!, + Positioned( + left: 0, + right: 0, + bottom: 0, + height: keyboardHeight, + child: Material( + color: brightness == Brightness.light + ? const Color(0xffdce1e9) + : const Color(0xff26282c), + child: const Center(child: Text('Keyboard')), + ), + ), + ], + ), + home: Scaffold( + body: Builder( + builder: (context) => TButton( + onPressed: () => TDialog.show( + context, + dialog: const TDialog( + title: Text('Keyboard dialog'), + content: TInput(hintText: 'Input'), + actions: [ + TDialogAction(child: Text('Cancel')), + TDialogAction( + child: Text('Confirm'), + role: TDialogActionRole.primary, + ), + ], + ), + ), + child: const Text('Open'), + ), + ), + ), + ), + ), + ); + await tester.tap(find.text('Open')); + await tester.pumpAndSettle(); + if (landscape) { + await tester.ensureVisible(find.text('Confirm')); + await tester.pumpAndSettle(); + } + await expectLater( + find.byKey(const ValueKey('keyboard-dialog')), + matchesGoldenFile( + 'goldens/t_dialog_keyboard_${direction}_${brightness.name}.png', + ), + ); + }); + } + } +} diff --git a/tdesign-component/test/components/dialog/t_dialog_test.dart b/tdesign-component/test/components/dialog/t_dialog_test.dart index 909be044b8..705dae21dd 100644 --- a/tdesign-component/test/components/dialog/t_dialog_test.dart +++ b/tdesign-component/test/components/dialog/t_dialog_test.dart @@ -140,7 +140,189 @@ void main() { } }); + Future openDialog( + WidgetTester tester, + Widget dialog, { + bool useSafeArea = true, + }) async { + await tester.pumpWidget( + app( + Builder( + builder: (context) => TButton( + onPressed: () => TDialog.show( + context, + useSafeArea: useSafeArea, + dialog: dialog, + ), + child: const Text('打开测试弹窗'), + ), + ), + ), + ); + await tester.tap(find.text('打开测试弹窗')); + await tester.pumpAndSettle(); + } + group('TDialog 路由与结果', () { + for (final confirm in [false, true]) { + testWidgets('受限高度的 ${confirm ? '便捷' : 'Builder 包装'}弹窗仍可滚动到操作区', ( + tester, + ) async { + tester.view.physicalSize = const Size(800, 400); + tester.view.devicePixelRatio = 1; + tester.view.padding = const FakeViewPadding(top: 40); + tester.view.viewInsets = const FakeViewPadding(bottom: 280); + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.resetPadding); + addTearDown(tester.view.resetViewInsets); + await openDialog( + tester, + confirm + ? const TConfirmDialog( + title: '输入', + contentWidget: TextField(), + buttonText: '确认受限弹窗', + ) + : Builder( + builder: (_) => const TDialog( + title: Text('输入'), + content: TextField(), + actions: [TDialogAction(child: Text('确认受限弹窗'))], + ), + ), + ); + expect(tester.takeException(), isNull); + await tester.ensureVisible(find.text('确认受限弹窗')); + await tester.pumpAndSettle(); + expect( + tester.getBottomLeft(find.text('确认受限弹窗')).dy, + lessThanOrEqualTo(120), + ); + await tester.tap(find.text('确认受限弹窗')); + await tester.pumpAndSettle(); + expect(find.byType(TDialog), findsNothing); + }); + } + + for (final useSafeArea in [false, true]) { + testWidgets('Expanded 自定义内容保留有限高度,useSafeArea=$useSafeArea', ( + tester, + ) async { + tester.view.physicalSize = const Size(400, 800); + tester.view.devicePixelRatio = 1; + tester.view.padding = const FakeViewPadding(top: 24, bottom: 34); + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.resetPadding); + addTearDown(tester.view.resetViewInsets); + const panelKey = ValueKey('custom-panel'); + BoxConstraints? received; + Widget customContent() => Material( + child: SizedBox( + key: panelKey, + width: 300, + child: LayoutBuilder( + builder: (context, constraints) { + received = constraints; + return Column( + children: [ + const Text('自定义标题'), + Expanded( + child: ListView( + children: List.generate( + 12, + (index) => + SizedBox(height: 40, child: Text('项目 $index')), + ), + ), + ), + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('关闭自定义内容'), + ), + ], + ); + }, + ), + ), + ); + + await openDialog(tester, customContent(), useSafeArea: useSafeArea); + expect(tester.takeException(), isNull); + expect(received!.hasBoundedHeight, isTrue); + final originalSize = tester.getSize(find.byKey(panelKey)); + expect(originalSize.height, useSafeArea ? 742 : 800); + + tester.view.viewInsets = const FakeViewPadding(bottom: 300); + tester.view.padding = const FakeViewPadding(top: 24); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + expect(received!.hasBoundedHeight, isTrue); + expect( + tester.getSize(find.byKey(panelKey)).height, + useSafeArea ? 476 : 500, + ); + expect(tester.getBottomLeft(find.text('关闭自定义内容')).dy, lessThan(500)); + + tester.view.viewInsets = const FakeViewPadding(); + tester.view.padding = const FakeViewPadding(top: 24, bottom: 34); + await tester.pumpAndSettle(); + expect(tester.getSize(find.byKey(panelKey)), originalSize); + await tester.tap(find.text('关闭自定义内容')); + await tester.pumpAndSettle(); + expect(find.byKey(panelKey), findsNothing); + }); + } + + for (final useSafeArea in [false, true]) { + testWidgets('键盘弹出时操作区可见,useSafeArea=$useSafeArea', (tester) async { + tester.view.physicalSize = const Size(400, 800); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.resetViewInsets); + addTearDown(tester.view.resetPadding); + await openDialog( + tester, + const TDialog( + title: Text('输入'), + content: TextField(), + actions: [TDialogAction(child: Text('确认'))], + ), + useSafeArea: useSafeArea, + ); + final originalCenter = tester.getCenter(find.byType(TDialog)); + tester.view.viewInsets = const FakeViewPadding(bottom: 300); + await tester.pumpAndSettle(); + expect( + tester.getBottomLeft(find.text('确认')).dy, + lessThanOrEqualTo(500), + ); + expect( + tester.getCenter(find.byType(TDialog)).dy, + lessThan(originalCenter.dy), + ); + tester.view.viewInsets = const FakeViewPadding(); + await tester.pumpAndSettle(); + expect(tester.getCenter(find.byType(TDialog)), originalCenter); + tester.view.physicalSize = const Size(800, 400); + tester.view.padding = const FakeViewPadding(top: 40); + tester.view.viewInsets = const FakeViewPadding(bottom: 280); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + await tester.ensureVisible(find.text('确认')); + await tester.pumpAndSettle(); + expect( + tester.getBottomLeft(find.text('确认')).dy, + lessThanOrEqualTo(120), + ); + await tester.tap(find.text('确认')); + await tester.pumpAndSettle(); + expect(find.byType(TDialog), findsNothing); + }); + } + testWidgets('通过居中模态路由打开并返回 typed result', (tester) async { bool? result; await tester.pumpWidget( diff --git a/tdesign-component/tool/component_test_manifest.dart b/tdesign-component/tool/component_test_manifest.dart index 43981797fc..b37ce73a1d 100644 --- a/tdesign-component/tool/component_test_manifest.dart +++ b/tdesign-component/tool/component_test_manifest.dart @@ -76,6 +76,14 @@ const componentTestManifests = [ ], exampleTests: ['test/action_sheet/action_sheet_page_test.dart'], visualTests: [ + VisualTestManifest( + name: 'ActionSheet safe area', + workingDirectory: '.', + testFiles: [ + 'test/components/action_sheet/t_action_sheet_safe_area_golden_test.dart', + ], + kind: VisualTestKind.component, + ), VisualTestManifest( name: 'ActionSheet Demo', workingDirectory: 'example', @@ -399,6 +407,14 @@ const componentTestManifests = [ ], exampleTests: ['test/dialog/dialog_page_test.dart'], visualTests: [ + VisualTestManifest( + name: 'Dialog keyboard', + workingDirectory: '.', + testFiles: [ + 'test/components/dialog/t_dialog_keyboard_golden_test.dart', + ], + kind: VisualTestKind.component, + ), VisualTestManifest( name: 'Dialog Popup Consumer', workingDirectory: '.', diff --git a/tdesign-site/site/docs/faq.md b/tdesign-site/site/docs/faq.md index ed6552fed1..75dda8881a 100644 --- a/tdesign-site/site/docs/faq.md +++ b/tdesign-site/site/docs/faq.md @@ -44,6 +44,10 @@ TD内置外观使用全局Token、组件Theme及公开实例配置。Material的 使用 `textAlign`、外部Center/Align以及 `style`、`strutStyle`、`textHeightBehavior`;不再使用旧版字体padding补偿。见[Text](/flutter/components/text)。 +## 弹层如何避让安全区? + +`TPopup` 和 `TPickerPopup` 默认不避让安全区。设置 `useSafeArea: true` 会移动整个面板,面板背景也随之离开屏幕边缘;如需背景贴边,可保持默认配置,在内容中使用 `SafeArea` 避让需要的边。避免外层弹层与内部组件重复处理同一边的安全区;`TActionSheet` 命令式入口默认由弹层负责避让。`TPopup` 的键盘避让需要由业务组合处理;`TDialog.show` 会按键盘高度调整可用区域,标准 Dialog 在高度不足时可整体滚动,自定义内容仍获得有限高度约束。横屏和键盘弹出时,请在目标设备上验证内容是否被遮挡。 + ## 如何反馈问题或申请组件能力? 先查看当前组件API和示例,确认问题后在[GitHub Issues](https://github.com/Tencent/tdesign-flutter/issues)提供组件版本、Flutter版本、运行平台、最小复现及预期结果。提交修复前阅读[贡献指南](/flutter/develop)。 From cf33e038bf2de1c84643c90df42ee8fcc2183aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=20Cai?= Date: Wed, 28 Oct 2026 16:54:23 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E5=B0=86=E5=AE=89=E5=85=A8=E5=8C=BA?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=A9=E5=87=8F=E4=B8=BA=20ActionSheet=20?= =?UTF-8?q?=E4=B8=8E=E9=80=89=E6=8B=A9=E5=99=A8=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../009-Feedback-ActionSheet/acceptance.md | 4 +- .../010-Feedback-Dialog/acceptance.md | 10 - specs/components/010-Feedback-Dialog/plan.md | 6 - specs/components/010-Feedback-Dialog/spec.md | 1 - specs/components/010-Feedback-Dialog/tasks.md | 2 +- .../025-Input-DateTimePicker/acceptance.md | 4 +- .../components/026-Input-Picker/acceptance.md | 4 +- .../example/assets/api/dialog_api.md | 2 +- .../lib/src/components/dialog/t_dialog.dart | 27 +-- .../t_dialog_keyboard_landscape_dark.png | Bin 10445 -> 0 bytes .../t_dialog_keyboard_landscape_light.png | Bin 10494 -> 0 bytes .../t_dialog_keyboard_portrait_dark.png | Bin 15360 -> 0 bytes .../t_dialog_keyboard_portrait_light.png | Bin 15750 -> 0 bytes .../dialog/t_dialog_keyboard_golden_test.dart | 88 --------- .../test/components/dialog/t_dialog_test.dart | 182 ------------------ .../tool/component_test_manifest.dart | 8 - tdesign-site/site/docs/faq.md | 2 +- 17 files changed, 14 insertions(+), 326 deletions(-) delete mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png delete mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_light.png delete mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_dark.png delete mode 100644 tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png delete mode 100644 tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart diff --git a/specs/components/009-Feedback-ActionSheet/acceptance.md b/specs/components/009-Feedback-ActionSheet/acceptance.md index 19c2671830..5ba1966088 100644 --- a/specs/components/009-Feedback-ActionSheet/acceptance.md +++ b/specs/components/009-Feedback-ActionSheet/acceptance.md @@ -24,4 +24,6 @@ ## 2026-10-28 弹层安全区修复验证 -列表组件在 showCancel 开关下的安全区实际高度回归、命令式入口及既有 Demo 检查通过;新增无取消按钮明暗两张 Linux Golden 精确通过。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 +列表组件在 showCancel 开关下的安全区实际高度回归、命令式入口及既有 Demo 检查通过;无取消按钮明暗两张 Linux Flutter 3.32.0 Golden 精确通过。以上视觉结论绑定本 PR 缩减前的 9505a2b5;本次保留的安全区实现、示例、测试与四张新基线均未改变,既有 PNG 不更新。本次已移除全部 Dialog 修改,键盘避让与横屏滚动不在交付范围。 + +缩减后的本地候选在 Flutter 3.32.0 / 3.47.8 各通过 58 项 ActionSheet 与测试调度回归,各通过 33 项相关公开示例测试,组件包严格静态分析无诊断;远端 CI 仍需按更新后的 PR head 核对。未重新执行 Android / iOS 设备验证。 diff --git a/specs/components/010-Feedback-Dialog/acceptance.md b/specs/components/010-Feedback-Dialog/acceptance.md index 78bdb94467..45bf8a9ec1 100644 --- a/specs/components/010-Feedback-Dialog/acceptance.md +++ b/specs/components/010-Feedback-Dialog/acceptance.md @@ -1,15 +1,5 @@ # Dialog 验证范围与结论 -## 2026-10-28 安全区与键盘修复验收 - -本次独立修复基于 develop@5132a7d07e70be18c2e4185c32bf77ffccaee605,不包含发布分支的版本号调整。展示入口保持任意自定义 Widget 的有限高度约束,标准 TDialog 在可用高度不足时滚动,并通过 viewInsets 避让键盘。测试收敛为 useSafeArea 两种取值下的 Expanded 场景,单一内容同时包含 LayoutBuilder 与 ListView,验证键盘出现及收起恢复;另验证标准弹窗横屏滚动、Builder 包装及 TConfirmDialog,不重复组合全部自定义内容。 - -Flutter 3.32.0 / 3.47.8 下,相关组件与调度测试各 174 项、公开示例测试各 49 项通过,组件包严格静态分析无诊断。Linux Flutter 3.32.0 行覆盖率:Dialog 308/312(98.72%),ActionSheet 539/557(96.77%),均通过 95% 门槛。正式 API 生成及 57 份文档一致性、示例代码生成一致性检查通过。 - -Linux Flutter 3.32.0 下,116 项既有 Demo 视觉套件检查和 1 项共享 Dialog 视觉检查原样通过。仅新增 8 张 PNG:Dialog 横竖屏键盘区域 × 明暗主题 4 张、无取消按钮的 ActionSheet 底部安全区 2 张、Picker 代表入口底部安全区 2 张;生成后不带更新参数精确复跑通过。键盘图中的灰色区域为测试模拟,不代表真机输入法。既有 Golden 不更新、不放宽容差;DateTimePicker 复用 Picker 布局契约和既有视觉检查,不增加重复截图矩阵。 - -先前 Android 16 局部复测已验证 Expanded 输入内容的键盘避让、关闭按钮,以及标准 Dialog 横屏键盘下滚动确认;方向设置与示例竖屏锁定随后恢复。该记录来自准备阶段的同一生产实现,本次整理没有重新执行真机操作,不能视为最终 PR 全场景设备验收。iOS、全部输入法及全部 22 个 Dialog 入口未覆盖,远端 CI 待 PR 创建后核对。 - ## 证据边界 以下归纳原记录中保留的检查点,未重新执行验收。标识、SDK或日志未完整绑定的阶段仍无法独立复现,不能将不同阶段拼成当前候选通过;细节由Git历史追溯。 diff --git a/specs/components/010-Feedback-Dialog/plan.md b/specs/components/010-Feedback-Dialog/plan.md index df9e585901..6034e18175 100644 --- a/specs/components/010-Feedback-Dialog/plan.md +++ b/specs/components/010-Feedback-Dialog/plan.md @@ -35,9 +35,3 @@ 补齐一/二/三个 action 的受限宽度、显式省略、显式样式和点击行为。保持全局文字隔离和显式样式优先;只修复验证确认的组件缺陷,不新增配置、不修改已有 Golden,不在 Spec 保存截图。固定高度与自定义复合内容仍由调用方提供可容纳的约束。 验证确认文字操作区在 2 倍缩放下仅有 40dp 可用文字高度,低于单行所需 48dp。用最小高度 56dp 和等分列的实际内容测量保留贴边双按钮等高布局;不通过 IntrinsicHeight 查询,继续支持 LayoutBuilder 自定义内容;复跑既有默认尺寸和 Golden,确认普通字号不变。 - -## 键盘与自定义内容兼容性 - -展示路由通过底部 viewInsets 调整可用区域,继续用 Center 向自定义内容提供有限高度;不在路由统一包裹滚动容器或按 Widget 类型分流。标准 TDialog 在高度约束不足时自行整体滚动,便捷封装与 Builder 包装获得相同行为,保留蒙层关闭。 - -测试仅保留三类根因:自定义 Expanded(同时包含 LayoutBuilder 与滚动列表)的有限约束及键盘恢复、标准 Dialog 键盘出现/收起和横屏操作可达、便捷封装与 Builder 包装。按独立职责切换 useSafeArea,不再交叉重复相同包装。现有无键盘 Golden 原样验证,仅新增竖屏键盘及横屏滚动到操作区的明暗四张基线。 diff --git a/specs/components/010-Feedback-Dialog/spec.md b/specs/components/010-Feedback-Dialog/spec.md index 91b5df3331..4063618a7c 100644 --- a/specs/components/010-Feedback-Dialog/spec.md +++ b/specs/components/010-Feedback-Dialog/spec.md @@ -24,7 +24,6 @@ Dialog 的核心弹层能力已存在,但默认顶边距和关闭按钮位置 - Dialog Example 页、Example 测试和自动生成代码片段。 - Dialog 使用 Flutter 标准模态路由承载居中自适应面板;不新增 Popup 公开 API,普通 Popup 的 240×240 默认契约保持不变。 -- Dialog 展示入口在键盘弹出时根据底部 viewInsets 在可用区域内居中,键盘收起后恢复;系统安全区开关独立生效。展示入口保留对子内容的有限高度约束,兼容自定义 Column + Expanded、LayoutBuilder 和滚动列表。标准 TDialog(包括便捷封装)在横屏等可用高度不足时自身支持整体滚动,操作区可达;滚动容器不得拦截面板外的蒙层点击。 - Dialog 保留现有构造与 `Future` 展示 API;仅增加可选的蒙层与关闭按钮返回值。 ### 不涉及 diff --git a/specs/components/010-Feedback-Dialog/tasks.md b/specs/components/010-Feedback-Dialog/tasks.md index 6521455f7f..5408caeaa7 100644 --- a/specs/components/010-Feedback-Dialog/tasks.md +++ b/specs/components/010-Feedback-Dialog/tasks.md @@ -8,7 +8,7 @@ ## 当前候选复核 -- [ ] 交付前核对最终提交与本地已验收增量的一致性,并完成远端 CI;本轮局部双版本测试、Linux Golden 与 Android 局部设备结论见 acceptance;全部设备场景仍未覆盖。 +- [ ] 交付前核对最终提交与本地已验收增量的一致性,并完成远端 CI;本轮局部双版本测试和 Linux Golden 结论见 acceptance,设备验收未执行。 已完成的开发步骤和旧 PR 创建过程已清理。原记录的远端 CI/Review 或设备连接状态不作为当前事实;相关事项需以实际证据核对,不能随文档整理关闭。 diff --git a/specs/components/025-Input-DateTimePicker/acceptance.md b/specs/components/025-Input-DateTimePicker/acceptance.md index c28f2fd34c..272e055839 100644 --- a/specs/components/025-Input-DateTimePicker/acceptance.md +++ b/specs/components/025-Input-DateTimePicker/acceptance.md @@ -40,4 +40,6 @@ ## 2026-10-28 弹层安全区修复验证 -9 个公开示例显式开启安全区,现有确认流程测试增加底部安全区几何断言;既有视觉基线原样通过,未增加重复 Golden。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 +9 个公开示例显式开启安全区,现有确认流程测试增加底部安全区几何断言;既有 Linux Flutter 3.32.0 视觉基线原样通过,未增加重复 Golden。以上视觉结论绑定本 PR 缩减前的 9505a2b5;本次保留的安全区实现、示例、测试与四张新基线均未改变,既有 PNG 不更新。本次已移除全部 Dialog 修改,键盘避让与横屏滚动不在交付范围。 + +缩减后的本地候选在 Flutter 3.32.0 / 3.47.8 各通过 58 项 ActionSheet 与测试调度回归,各通过 33 项相关公开示例测试,组件包严格静态分析无诊断;远端 CI 仍需按更新后的 PR head 核对。未重新执行 Android / iOS 设备验证。 diff --git a/specs/components/026-Input-Picker/acceptance.md b/specs/components/026-Input-Picker/acceptance.md index dacb3a001a..67dcaa9d11 100644 --- a/specs/components/026-Input-Picker/acceptance.md +++ b/specs/components/026-Input-Picker/acceptance.md @@ -42,4 +42,6 @@ ## 2026-10-28 弹层安全区修复验证 -5 个公开调用入口的现有布局测试补充底部安全区几何断言,代表性地区入口新增明暗两张 Linux Golden 精确通过。双 SDK 及共享回归范围、环境与设备边界见 [Dialog 验收记录](../010-Feedback-Dialog/acceptance.md#2026-10-28-安全区与键盘修复验收),远端 CI 尚待新 PR 核对。 +5 个公开调用入口的现有布局测试补充底部安全区几何断言,代表性地区入口明暗两张 Linux Flutter 3.32.0 Golden 精确通过。以上视觉结论绑定本 PR 缩减前的 9505a2b5;本次保留的安全区实现、示例、测试与四张新基线均未改变,既有 PNG 不更新。本次已移除全部 Dialog 修改,键盘避让与横屏滚动不在交付范围。 + +缩减后的本地候选在 Flutter 3.32.0 / 3.47.8 各通过 58 项 ActionSheet 与测试调度回归,各通过 33 项相关公开示例测试,组件包严格静态分析无诊断;远端 CI 仍需按更新后的 PR head 核对。未重新执行 Android / iOS 设备验证。 diff --git a/tdesign-component/example/assets/api/dialog_api.md b/tdesign-component/example/assets/api/dialog_api.md index 33ce04956a..14fdcd79e0 100644 --- a/tdesign-component/example/assets/api/dialog_api.md +++ b/tdesign-component/example/assets/api/dialog_api.md @@ -36,7 +36,7 @@ | --- | --- | --- | --- | --- | | context | BuildContext | - | 当前构建上下文,用于读取祖先配置。 | 是 | | dialog | Widget | - | 要放入模态路由的弹窗内容。 | 是 | -| barrierDismissible | bool | false | 默认为 false,点击蒙层不会关闭。 显式开启后,蒙层关闭成功时返回 `barrierResult`(默认 null); 操作按钮与内置关闭按钮分别返回各自配置的结果。 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 `barrierResult`。 键盘弹出时,弹窗在键盘上方的可用区域内居中。 自定义内容保留当前可用区域的有限高度约束;标准 `TDialog` 在高度不足时 支持整体滚动,使操作区仍可使用。 | 否 | +| barrierDismissible | bool | false | 默认为 false,点击蒙层不会关闭。 显式开启后,蒙层关闭成功时返回 `barrierResult`(默认 null); 操作按钮与内置关闭按钮分别返回各自配置的结果。 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 `barrierResult`。 | 否 | | barrierResult | T? | - | 开启蒙层关闭后,由蒙层成功关闭路由时返回的结果;默认 null。 | 否 | | barrierColor | Color? | - | 蒙层颜色;为空时使用 Colors.black54。 | 否 | | useRootNavigator | bool | true | 是否将弹窗推入根 Navigator,默认 true。 | 否 | diff --git a/tdesign-component/lib/src/components/dialog/t_dialog.dart b/tdesign-component/lib/src/components/dialog/t_dialog.dart index e307ebbec3..bd86b3f717 100644 --- a/tdesign-component/lib/src/components/dialog/t_dialog.dart +++ b/tdesign-component/lib/src/components/dialog/t_dialog.dart @@ -182,9 +182,6 @@ class TDialog extends StatelessWidget { /// 操作按钮与内置关闭按钮分别返回各自配置的结果。 /// 蒙层与内置关闭按钮通过 Navigator.maybePop 关闭,遵守 PopScope。 /// 系统返回及未携带结果的 Navigator.pop 仍返回 null,不使用 [barrierResult]。 - /// 键盘弹出时,弹窗在键盘上方的可用区域内居中。 - /// 自定义内容保留当前可用区域的有限高度约束;标准 [TDialog] 在高度不足时 - /// 支持整体滚动,使操作区仍可使用。 /// /// ## 返回值 /// 路由被弹出时完成并提供关闭结果;未携带结果时为 null,不等待关闭动画结束。 @@ -224,14 +221,7 @@ class TDialog extends StatelessWidget { transitionDuration: const Duration(milliseconds: 240), pageBuilder: (routeContext, animation, secondaryAnimation) { final centered = Center(child: dialog); - final content = AnimatedPadding( - padding: EdgeInsets.only( - bottom: MediaQuery.viewInsetsOf(routeContext).bottom, - ), - duration: const Duration(milliseconds: 150), - curve: Curves.easeOut, - child: useSafeArea ? SafeArea(child: centered) : centered, - ); + final content = useSafeArea ? SafeArea(child: centered) : centered; return capturedThemes.wrap(routeContext, content); }, transitionBuilder: @@ -321,7 +311,7 @@ class TDialog extends StatelessWidget { final effectiveActionSpacing = actionSpacing ?? token.spacer1; final closeButtonExtent = 24 + token.spacer + token.spacer2; - final panel = Semantics( + return Semantics( namesRoute: true, scopesRoute: true, label: semanticLabel, @@ -407,19 +397,6 @@ class TDialog extends StatelessWidget { ), ), ); - return LayoutBuilder( - builder: (context, constraints) { - if (constraints.maxHeight >= effectiveMaxHeight) { - return panel; - } - // 仅标准面板在高度受限时整体滚动;展示入口继续为自定义内容 - // 提供有限高度,保留 Expanded 和 LayoutBuilder 的布局契约。 - return SingleChildScrollView( - hitTestBehavior: HitTestBehavior.deferToChild, - child: panel, - ); - }, - ); } } diff --git a/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png b/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_landscape_dark.png deleted file mode 100644 index 67bfa64d19439bfdf9b83778efa8436e577560ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10445 zcmeHtXH?T&w`Z_n=TWKBECHl9Q94Qwz4s;%0qLCt0;rFuR1FeDDGG#6kQM|&K#>{& z=^`Z$CBzU2(j~O{2j6vPKHNKVKg@?&YhKo3k({#6IltZa=DCTH&biZJW>Qz)#dk_h%r`6%a)8u0=%V z(qwpq1L@)N3Nb?#F_Zx9sv;$eo^a(>a+v|?6TyG!U3sgn4!JduWm$5j zwVR5Ra}ycYAtE8sTlCa-yvo;JB3&N^^}-R{WrBEgl4ozE>5<^_z*Spbu$@RI&kEUE;zZ zDTRaa?lO-fHd?wJBpermx|DLSb1O(}e2MoRujkV@0`^sm4#fyEmbOZD=I z+a+^|Ha$Rz%L>|^WM>fLQIxSe!7bWk@SOe8abSS6@O%nNH0F2f-44BqH&DWQlem2d z^*G0znBC&;?(TSSh>sh3&p3r;y102nsrO2B6pe z_Pr)yx^kfOww*F{lsX(2C!O#=C-YkKpmeXoE>hT5WKyc$x!)h*xzOo_;nm@hWZRm= zh!3yQ(@P5qv{6vui_a71Fdb+A99eSP?!Jf2n@~ChF*9dVIY7wCQ7h<|as4FYJt8LV zjCZK^=%s(J6A|uS^WACr1$K)}roK8OX)!fY zo(I3W|Lhnco=tRaZJYJE=K6rXWHAuqQG6WB zcK+$popRknOa-4!c?$o)I|^lmqLd%DysPVxPxh&>POz%r8y;?r;}sh$Ff<1a08`5A zrUtTABEgWCx|$gV+NnausE%1v9i6AZ*>e6<%4un7UcjA7ii%9Mw4M|g=U_qY$z%)-p!F?nZ8IjZIGh9HASe_aw)kCo@%EEL zj5IH#uLn71>2Y5^!7I+y@p4waYLaH^yc+R6yg^bz0tFUGg$$35Zox2kyi=FE8PdYe z?hRrB>kEw6*3{g{FzB9L@tnfJ#>nYnwz)1+MHV9Hkr69EM%g$xyt|MBh|OgH>4dhb zYDq0Etv6~h`vJ`Y4AEEjN?-4h^A1@~Z!YT$#Hgt$Tfs?b>C{x>0p73apCj8k5k9Ti z_c9biO8{KiQaWmV$Fb3UeQ)IS`BHQo9Ub)qQ$-{ttrfFI*80>c8X6R9Yio-e8ti~s zz%Y?Wq>{3-SF`eV&CyK{yuH)(&^KYL?#GWX`Hod-0TRcMn#jn;>}a}|FA?u(USROD zk8CcIHb9$fe7Yts-O5mxQ{-P6Cr8<1ViO+Z^3#Yg^d;V3hjEXFcPU@zff(Mqfg%L%Y8dQP@Ze5 zBj;4RTU7W`hJw4l_pdtzEN{T8D_BlEexnrbx0ym1RvE(KaEoCb2@Hrq8iNv)zBn_&!gJgwTp!eN=i$2l&t~rIG54tp^-eqE&N>b8uzVA8-t{z zq`iI3y#DF)TmYRGX&yfD{>@E>QJV7Ho;r8?tP-Sx7@B) z54b1_+O@nTn%d<_?#)6t`Hy3*Fb>5Sj06CECn-pnFU1>>dSw2>!h? zR!}HZ4{bIEO$7`EC=n9|aX#3nU|U`o(4pbXKV`E$N)cj9AuO$REv-=)0vWQ_L*Fzv z7T%O-m%4U4*~iNZP?gh9)W@hM6Ml8qUOvP6ju!wT2r&Z;Q8$5**5y7IRL^?)NtHg2 z{}fIkk{{LEYn1ltRVQ%UzfRuZJSze`956i0=Xp9Y7e_`$3J^P+5G0_rz$SXnJdV5U zA|nzA;a))4!QIfK0n39j*FNQDdlpwzSO*7JGtTrGLpIGKDyCc@XfybHh6ihsc5Tc- z^zg{Y{fZ|q^8@6|=yZ5!NJvq2wK?}~zoGUd?&{L#W7u*m_LiKS9F#w}-eF;J(IPl_ zO}ZkT>+GS?m3NoY=hHWnVNdNK9vu5HEe7+kw6shb6I$C|BYW@fZUcG;U##qCU-+QG zp3*^*H^Mw+pvZ|f8Bog%&sN>^KPbSpVjM@MT}c5;ky{Jo+fzl$DhIpoj9IuhwYGq@ zAi=nYDCLnWZdy8Gu*~oY>u~N$^Uo(*tHj!70|C3Tu3-7~X67LPXT>BawRAYie=K*q z)S3Xq32dTGyW87#AK|r8wYBi3_jjMq;-U>63tW6&R9V^o)8+!h>wtL7{cFU2?a0ll zEK`DC?z#L{znZoAkmZJjb)hxZSLuFDqSuGa8;4%_pYJosY}oYiw8bBCMZ>LdC?lBZ zm?8xC#%X#>Fh=Z#X~06PZ>ND zEcm3IFeoeh4RGx6yteA-z1Y#3@9#~1hNUO8eTGA2{&+XeM}TAS^ZYi!L>rvRAM6I) zLW)PrQWN04c}VI}kBSXIH}-10KD-iR1hdC_ep(nF^HgvuTVExU zSvbY9#O3BmQqXf-6m2X`b0*?U=^;yW)dxy9HpV;yccLE0r#T(fO5ir6lz2-bh+11NLG0j|C42}ie5C-DC5wKX}|yn!4svLfuh%p@RmXL=&l%Ir~cS7!uL zyE+4T0P`+z@s#Uf#KP3nZ-(% zv%QDm)*+`rdGo(KxjY#M!FPQ3=FM{!I7F{8umL4vznG$wt&Gcd$#SDbUgKD%I)OhE z4cF6^H%~ksv+X_&cKiomA)jF87q;ADF$3EuNRQ(5sKx#cPE%%GW;k=YW@Vb_@TRx z&Ezzw`RnkEp!tY?^$(2GI*Z-3&K!#66>>8BpM{|7XIcOC$&H8WU!U>-LwiUDG`p_- zXGe>!;~!0EasM;p_U8qOT8E^i*bnKp*w7qUKrO$Kl@offZqoO=3K$p6)5jNFpvWL} zUe(}ImAUWrsySybLPZ5MjRotdERp3_+#v39@h^6etTV3VGXeUJ(dX!e<bxC?cda$q^?c4J9`XZ6;5ibqPfjfe%y zW)I_LP>ap~7W{uroFcRwWNLY`nTYIS#nEMaq@_Q?EF87^P77XvDNpxEB^Q*_bE?GBU40wbyuD36L?z?i z%UDVtyb5b;WcB;;hI-F65wW46^~P+*N+zwpw>{qhW#KqKQr5+Xpl3!QRyf43!*N|& zSTLnB^q$HuR~ux_yB|uq9YAvO%!NscW@r~xEJi?YhCB6VTgM1PsvNKd75m5|ZE_-6 zk$yQYE64OnJ)-8hrM6w2?^(*RxAR>n2I$laTK3^x&Nc#FW;Nw^yXE(ispna{(ycMN zR3qrXp0O-&wD@q5{xQ!vir4J$u*ZC8hn`~I!ESKjK2BN$LjPH!ytg#)q9lH@ z;h&***>?P0erwqosy#&k-h`?Asfkd}P3W{m1V=FE+xR_Ltbk4GB{hn7~VlzU#w^Md->PQJat zL-<*{6qqG5S^D^%PTy!77&46Z%W{}a8^zXy1zVIm?!}yE`bSge1Bi1}`JwCac<)z% z1B$=q-z?5@36-P7jZ5Ke8><|KX<*ozpw~h?l_Xl$jhC3JG>&wtx3An(0p^B>wxYEu znwnWk-fn?I=se9~b@}Ua)C=XA)KOvCC_S`n(D>v|5iw^7kRgBuB0}p%EpwD-=U)FbZSA-{%l6CG@OIU#pgqrbZnrwiJ}JbReY@|8};X!19{)@ zLBzDgQsf>V#B3v;Iwx9YhC@{R2*bbo`N?sW&7$N1rGxI{5&1Z1%qescra{rP@pHy^ zb2x}?I7q2Mw`*6A>9Yb-PoA=apajKt?bE(Gi9WEa}{-EY*%e7Kt;(SAGtB3a}gB6i73G-gHCi zjON&X^H9p^K#rrrZV9p(-)H^RQ1bxq+-N`e<9F|Su8aniQ@&Hd>r}T1Ec&Rg@RE;# z$jff`EnY+S8eiuvH}p2P*Y2+u0$v{GX49{)SBwv2tnDE_p9Zxby>A0b^!9V!dfFX= zD+DX+Kc9Z z`1{$B-eIT$pQ-IC2frt8v7Vzp_;rz|3&lrYL32!|hoFidXJKr{F%@91W$IQDVw3=^ z>#6@~e;U>MmByS$7?(XWaA7It^f3RFe8}bRqY~oC4s6Ifm2&&&!CXKisyUcLCKa~d z*iQHFa2&6yFjU~0+=@!)v*+lC=^vpFjU5;1soNN$KLhl#e_2%xf`U?tZ|B0jybYW` z=9?g^3K1I*Cd1py)m&oPl38f6 zJ+Zz(lc_?V;IXq_c+QlmCE`=XJy2q>%IFiG?cxta0*@Si5MK{#~)C z{|k2rN+6y5fu&%@2rxOi$eAo=FhruxS|Y`HKijfX@v;*Ej}IoEsP)^aZa9xayHLbz zu{uT~SA{N^Mw47gmS3%9f=rNel7cqvU#>`Ul!#FFo17+Tf9F1@C1t~8OXibl-!c>^ z-+?x~AMsd-R2%d+$i7o)R=GKi7?j88UdwyoEW-28 zdhwd^sgj#S^qwzeQSQ2qw&u-g-6~7gpmUs@lvciltRAl9)|fdn%0q8a*%ogm7v(Dq z30&#jGc!IJp^nyzV=1Snsli^BSUVJk$dvfTd~8y(l1UERB{>6rE*ci{BV3^tPA=Yh zkb{GB(E+w50x+x-OsPP3!t~xZ^rJh(n1k55o#mIuL>rk}JZE1?foAPwCUR|d0CO+~ zAp>QOi1`dNfAH_d3ZYJUVS$E*Wo0M%&EL9*(cD(tAKJiL+LfYz0=Qzi3jXUclfW0q&v)rc|z2Y?q zSWf>XND0~_;~&_t({bFSImfaytBLL1t-iKtj=`fKZDv_9PI;!f54sA$%rIZI5W)HsG=Be*#mkLkvTWiv#GV zNrq1OTplr&UAm>Kq8$3jAKXr!8(=o89 zmr|lX8C0KN9(jpQ8JyI2X|9xg&+K$olqc9C)5ALqt>aXOZelj4ryS7aY0_X}#Fy?a zufpZNzL#o7NB1IlmvkhCV=U+M4kC`UoQmgS2VGJJJb^E4v2=Cb7zxC)n%1evmm{hb zl<(C}4ChO-zQN^dUWQ0HqGe9n&e90v`Vsu*(Fq&;xx*JnqwzP1e{5IU9A z<$ScnKhlFeYSYuSt1gV+@X6ovSAN%?lp<`RYzU|hf_CAOs!5>=H5wh_6Tts$g|_Hv zKoMw#I))IElPvCqi-J>SWl$Phy(}M{n{n)=(aOZc= z)u!n7j?v^FHZBF&AB~|OHfg5gF^9Po*B4Qy%uacMvp|9rTlpuyYyXqXaV8vQRW4$O z6^X;i*82)wj2QiEcm9c$68u2r<2)Jm*P?8`ykAN||9l6wx6TK-*7F@{e@%FP9`;sK z^mbdO=SAi^(tkwx^_f2#>7ay5=~+B<|6V1mvW$q^!;BemdshFcOzJ%lCo@3h`jzX( zQN|eNhtjTvO74Y9aX82PXtDKYo-?rQQW`BG72GTTo^q$*S92qT_sb z;PH;R*PM=4g2L8{B1)4IO2fCV?RT<^33H#uqx%qq|{WRzwUZ z0jDw;*ur_$Cic`d_5=oBq+EadUzQ5|ORVMCwEX#Mz~()%5o@Qov>XHS=1aQZi_u64F(IqzNOW<`Gi_@cj9#!CF2Dz*Q1v#mQ z6ZHx}UEyq@j>xcy~p{)EJ{smvpK9UqRA3=~ zua7uHA*55Tk47078Uh^%9sd2M%VEnSWWNSmq=kc7+0*El9H727Jl0=Ktbo~s6ZZ&< z_~qZUy3lTQbm{$`%wkWmlAgEJ_Fs<2 zKyycc2ve#TXem-kL@P`XdtsBCN#i@pbrCDq5Sy~Mi;9aO#Dh;P8>^xfKXVf#zFAs3 zVbu00&7=)@==M{|G;mgA@0f_N@JK^w1+*?lx=CBIdAEdy-$`Hi`SY6&2B&UmnTE_? zjwa{SuB#MMC~Er!33%YJYI`DM@q*=XI=_rmBqQhe_f}G31{Sum(B5j>ftHq5l)jjKs&op_8W$s&eH0ag=%EMpvg>^9 zks;%w%>}8(PG!XX&2aecbD_|E7@1PghnO$g2^*MPK^j~X21&gPIClof$5$d8kn4TK z{bV~k`;GpTXmDf}#LX=={`473>pDwszGw@^?|9wv*SN0gK9!2Soh>R-U&2ZRsLuRF zB+PEOH>=Jjrk##^q!{qdw4w>`^itPiZN8^RRV|#xlZHY)IM_dm%%=<%dUqse(Kq~Q z{huEDo<8wd5!DkK8n2mKQe51nIv-?veU*<1^tJ8m8IZwW%q&<6NAvGA{IBh|8!XP- zNY#TUlGLqc=e#sg6g6hA!hZettg#57xUK1k8;xeK!MizkN>RPYCdDYQo-GLdc zGob|Q=CZvVmY=w01#6&f+T6Gm4H*D*3c#6-KEvTRLYs^XS!v?{MA^INjSjp$*rfV? z?~q~6PMI=aO0NQW51D^QDqv{&-fV%P;@&!x-f3z5U?-WkVO@itr!D*}$mIx7`*Aq} zTdx#aPjAKydlhDv7)Q^zl}vuP8-6fjy}A=cU-a<*Hf-%&Os6l=`&vlh<`ba0| zW;}6!0qZloN+N_T)#jK)N8^FU?bPDMP9lA?xhSmlgk!|?HhqFfEQ%#oZ6 z|AeE+Z;c&jM7_AgXp(S#>q_9DEUUt6T~|KR=wp4sKtrSDSex)Yz*wGR z_xa^J5XiR>=ubbm-pE;E#-!#2UJ|ZM8`%eG5xXx}-PX|f9hdUucTHbh`Q7#-i1cLQ)v$tpDT>Y`JxP-J~c+@z&=T3Hn9k~Vf zk4f_L11Q#>y!m;kt!<~@p->3qfLzm2J(r+<`gHtyN#;p>{IPs;apY0O7Pya@x%pnK zA_P+5k{4X#kZEa7+1Tb7E&YCIwP3#i_dz<9$~2}UpAe*az$l7P(5eURSj z5uA0_5PIs}8yh|t+576|d3!e)tlvNR@kO09yErWf#6oH5N{xk~yU5|}+MAs95lX>) zLG~Ai^xPO>VKn4U$n)xvq4PB2Ydg}u+p1Z0IF9)rchiesr~lZ#IYf^HIkZ+!xuYf?Fe+eHMB-lr^S+uyk$yUV8iFgy71jMaS&Jj_5H}R3>qb{n5XYVKa{mH)$|j zNb&_*!e09ZAG&CLk!c7{@WnF&uZV5YXx-iPJd~*$3_a9caQBe#N{y=;y4MiB=l!|x z@bCsc-5k9>0!O~MxjWMw6VcezWE3*|Y?#3~_$p&8AS5Kj*^T}F5Cmf5QuO$kP~R`7 z@%+70QH)a8kzww|(zPNb!|%4#Fh1^*ITO#kr!`9b!o3x%SPTZ6}(Ot=Ea5-z({$w4w`)rjMB5_$}h38v8Q5IXTb`k-gWxG zSZix*gF{2@F&H7y@3;B+`R+tHC1*Fcv<1D8$eE4@vU`q>jy-JD#KeTNudk(l$}ynb zF{QQh_LGh#fo(I%Fh`vDU|Zeb5OHB*f{TB-&l4kFZ_@LMHuV73ie9Q6)q?tMyi^Dp ztGEOu6c-oYKVqcCpX;Oj`He1WVV)f`g=wx2$Dvo zak$sfqerQ+<&Pg9b186u62itR9!poq_8A3avZgk0;{u0Ff~I}?tY9*dhnL9XH*Dtm zNur4TIQ5d(BUO9-wunGe+Zjnn$bfJS|WA#kVmMV|S<>JF${=Uz2{wWdl=7+uP zR2Qf2vC4qztM6XcP^m%8#;68P9(HhQDu)QOGTo~dch$+1ovP7&bN7C#nSeW9jedVu zJBU&0X)5}VPt*tKYzGb4*^FY zrlmKcqM`~Mv(v*`zo-uC%hKq!+Ts!&vyB6nCTizDeCYZxkY61(UL`qaM_8HZ6iVYa zKE8tz1OkDtSbYcNxnGfiSNzIAa>OCMw7fjm9`;fPSn3*Biq%*GR5;#Twjx-wl(>2; z303m*^VONzyv7Fq7dOMppUv)rhfo#lVG0+4{}W3>g1eVO85(NhD}FJO%_CMpy)%_n zyB1wU%R_|ZI1N4_)fnM%qW~CPR#p~4L)X3ZXCx9SeXSkG6?de%Py$y6=!y7=HpeY3U1ryd4jsU5QyoT4zrrCaV0IW`!F#_3p_%R3AaJ z>2G>X7Mi70s_|`=XbH9Rsx z2ExNk<1n(F$tf8>1z*8{zN$dlseq3A%GclgP(-1?K*YldnHg+aMxl>>VQuXh6V{CY zFK=%noM`QYZ{ulNhC%<1y~+>2Qoo=91vW!`eNO?oFkE!RD5zIo91|9L00L?8R<*82 zv7N$Wax~arUp zIop*I93Cz^2T=p~S2vopH6`IBn=L$Zb#q(qbO2%YpxKANdUH(CB@e$(v)g4D2lN7U zt*x1@1L`MjU-lDJCX?g&_n&DGDd^%v(ekt$(}w)A@WR5|X{_~fjNAvE^;YwKc{QuJ zlBOZ;?#8IaRX#~-F;w74J6@PWc%Wob;HtCE`?&s-udi=#WF#ygV8;D%)wP+9>rqkU z%F0T-qdgXjotT_-K_Ez?+prHkyIR35$6-T}On2HHaN{#+2mXkdTR>SoeT{0HD{} zk)7Kjk?8)>Ga(rP00qYwEchk5p(>rffU2J#Nhd^!!=DqJoUtNi5^q3#2!;ZZR z4=*Z3wAmog=MFP@&wwp)>!#x~En-&Pn-afya9#+q0~`o>7K4oR^-2*_M{aEgcoO1J$bw3kzTm#Zs0Y@U?2#bXvMM{^PCGrp9QI zSiK{;f3a;ft+%{9enMAIUmf7Rd08=8vn|WqB%?2r2m+W&Jc3-P4P1Qqfno|g?)@Q{ z(kE2EaY1zWy;MXbO+CIce=n^#i`7(eI_U_%X23ac$2L`#byNgIpZ3aA1e$!pzT=op zRnl`ioDo^(s^fW89xU|Oz)K%^+EPS}4+z?1AC{K82+Tknjhi!?e2`wO#|!+CckmL} zHoXXh2t6f}xj}S4Q^!jbzz%NA4}Sk@>4LpmR8(zKW2C!I+IMe(HDw+@bB3K{N4EBg zKJ6|FGw>=VTn5<02;Wc!c}qt45xv~-a9Ns?rRCInkF~|R-@G~J%AoM%(gAuMP_wcC zQL(6~Xgt(u!k+95GDahS5~q!gvkrp1ch_Ga=G79tRkfju1kHxkX1??2NLq@?bWR!l zO=w6+PR%ah^rgeYsoo3O=xp!;l|9+up zcvwSr{`X(YE??RQ&hb};?BEwYWEtc4rCA{NJXzza14Sa8m!UoE7pii*9=qBVmk_hE zo<=7~M(a03Q4O;Uxdt{%VA0r!^*`A2mzm(X$b$DUG47+AUgq%owVjG*Tk|2i3QBb6 zKX4x$PE4}XoL^>bmzWimz>4kqxgPi2ud~%!TTj5J#*N>!Uw+7pMPMUZD3;T$jb})B zT7C1<`M%?p?Rag7_bJT-ieIu(gREojiH*zPUD7)(?Z6{++!N~=)VyZ#A`Qi7X79m% z|NP5i9tk@JScYTj{;=a2SW3ZCDbJ^x4(0mImLWXN#%v&opTF42twNd3&mZCbQlTAX zeJfDgx-mw)toX(5DCuDN6pE+sleBBhp#sw6P|C&i^uOh8!{kk4n3LP{KV7V3oFEfTeG-Z;0`JW{nvIh&4T6aV8 zST1I9f3{I;gBjj$DupJgFf`F0J3ZFE^ZV0ahi=AH;q2oy-y@^0#B1s$E;@38JJi}= zeNFeP&i`y55S3RQ$@G^;b}3E!`u=I^J!qjzEjj~zHn7=&Hl3Rt(&9Tvvx5vUY@o^REBW~SaZ86x7b}jI0 z@rooH*4CSZ_?BH-BU(@^%=|*!_U#gaMxnA*+_|xuhp#34p!R> zhERf#WN3!p8nH#sFDb2-m5k2qk5rwOirf}yo)Z(fcl*v98FFPxZ+P3nmg8%T)E7!l z1;mA?mo7Vz2@Xo|?BXQ{J@2N<9C9cv)9|rzdk7Wx15C4lS4lrDPwDx6F6&1pm{PG7 zjxnZuD#pXCQ75L~B!e>vuLD~Y&RyGlTjGWKXw|-&jJ)5IVcO$4*}i1CL;K_&&MvsjZ-+A0I(7sb7kbK@#5YXMt$(^1)t zh(?%e$)8y2?VXRxJd>}F*k)&KFBPeyKcrrYxf%m!)UMBV1xL*nX#nYE$ysi`4p%~n z1|GzOIb!0k&WJR+FS#VLHLH)hAiR5Ck5Xs^Hzszw`m-_SXZue+EgScs8$?V$OuR&H z-XiOXli_epo+a+OehbbfqPa;pi;f93MdH!H<&B{M(nTlBxErmjm_w(c!om;h^Lmb> z4OMb8o%5acXhmB6lwkRa z+VT8hbbo#>lyFN}MC(c{Yh(9KQ1nOp#!aLvg1b-x2H#}jE_rYIU~?n1bIz?_B_)(o z%f2-|Df;Z=yEI?V>c=^Fix$nHj*+?6PBZ==h%zT*+x|?FH^E#rtbe}xC_gWQ`n0f+ z&?ZeLH*k|!>qdySUmdN4_ePGx3G&Tx*OSaEj=`rI4AnNu5A|6F_B>*dMwvp7QR9Bx z9I^!cLbC+DK1JPTuc)s+h9}eOQ${}72_Au+Xwor_z2Mt=P4Ige%cQwH_0pMcH8t+f z-nN>Ka&9q0-ReeosBJmxSIb_<{l;uj46M~E$iwkCFwGv>I4qnj9a}V6pA`ygkuFG0 zmrllPU*Ua+3^D;$^00s9Ao;GY`04Y}fq_Cc*)UAxm+6?IkF&wxDm5qLx9kwm1Vt z^^vf!a|W%IXOt$es|5x12ab9{Zn?(K7cLQ#+oHqt zr5{t3&jx$M$I?V6{2G?_o!%9B!oU^nVwQC?D1B`{&8K8o6=_{&8dXa^;loI~ zHNAB)N&4pf_Do#{&_pk*%_`9B8-O@#`?Nwms@XCKCIH-6N4G>ggyde^* zlP%qc+Z+w$PxM$YG zryuU8A0;WMjX%PwF7;+TVBZferr!}21OLU&=`VM^*jiKN0ju0AvGG?*>yv()7cqWu zdYUH3HwhHa&10vVt7`FPZ@FT%>FC(@g1orpLDr-Ckci0V2TP8#pV~x6C^WLmCNB(k z2=cahq}W0o$+j?=cYRd21w3%8vyL}5kt>RYoJY!mxa1fzFE$o-Ere5iuBYiXgkG~H zTxP6^nx$>&?7b#sz`2TZuC3isKGUMFCVtm*J*}=hx99M>%fzqbI2cS5SOM&4r-`*> zsrHh`aU{uD2a0OH$vQL+V8Aqx{yw~;rnEN9u3z=d1cR9V)ySl{bQ&#sCezqfM)W%3 zuIJ|Ox`vArvC=&4+Tk#vj-&9fG)Tm#;r^*-a(QeuWIA0W@r;Pv^?3r)=*7+h!8n%} z08LZU7HLN&YuGR61v$}@_RLd_T6OWUvGG@j8iz;IS10*}>(bO%I?TPGBxlWnshQPR zkW}PYb-XM*ne-|h8_O$m_V(@BNNJhLG%h#h#Y1VvJUqQM%99aNSjY?qYAZ;l^gVW= zGU*~4%8}ge{Ls~EZ{w%6WhUQtCQX@zU5IGi3<%9uDuQq$3Vz>VGci`M(0n5(fH3=B z$*V4Q8HmoFkYg446C;9axuWa`PurItoBw_eYfR1$?JPLBo@rW!`ST6A&eAHJBNT?q z0z79*t*mQpr8ZdAFAbc}bhF}}=~m4zvRBM&?pML3x((H0Rg`#}RfO%&bk6{3NtJX( z%KtN6($x|l@2%=Lu9R$Ww)B`|wn_Mn$$MEw;XaXX{GvF|Sw3GUgg3n0c_0SuXKoCi zt~FGXuJlaR)~nxkD5p8@pFlCUsrR2zdYTY}1l)zu%cA-T3xG5R(q2Muj(bKVqT1Lp z+n_XzJ65TCA~N;|w3U=Lvf1Gl%KwnH+^dMlj`U+<4U$c)D5mSR0P&1Ms&n~WR(C-Iq}?1*GoGboP`V4~cC2+mI*93xP(roe zo1FgEYd#<`+3bmA%#zybECRBN(d(UpzGK9?+$XP=R~ij0vSQ>h1(oGGohlxr_JRZU zj#0oo8##r%QdPHi*K-eMZ}jqj= zAT}D}cP%X64=<*t8rI5Ehfw2mBb-n8La2R11iiJ0g0t`d;XVp2a3lCGW8S6q$%K% zZPJZto0ySGb<}K4W7rj5w^VX1V9sDXwvgH{iHmAQJBHFNqJNSpb3x9s;VofA+>fx1 zbkTq2n@iOze_7@MU&i-|?Xk%ifSoQAae-Rdm<_M`QeFE|K{-aW5;@8#f2|@OdPB7k zbO<_=TQ0j{q?KFIy0p2aN4CQms3nr4%dW)qK~ql74AQVdq5kd7{n3+^=4M2vrj_NW ztmxHfHF8@s1|#>!P0_|;$7MQ#*LoZc_lpTEZ(i+TM#uf7=&%ozyYAMx3TniC|_14oxw^)%IJijcSq;C9PmFkY-%tbIy}54nearantx|t zT6_(2;O@<$aytoMWk&q%F2yff(;&N^H0l(c@x^uNrV&KGkJx-3-b6pD_OPW~6wkCp zvsx$wbNQcbf$VX>;hf=6Gjk#e=BzI-xTE+v*_l_JA1e*W~z`V3{1B4Zj zqW~fsxd@udbCsQ{O597b`@glk0u6SVm=#Y7r}225v>t!?U1NZY;A(<6J-4>Dc0h0v z6730t!DQcGsP3t_{rTZBd)YJ#B@|UK4Y$fWvgM3@`iUd5Iq!fuyWHTuX?s;~_=5(+ z$NPGq@tENoJuaL07MS=v;Gtb|J_b{Z~Hxkb!!G-GVs!uNPZFD zDt&o*+1E@`NZ;}(ZxH>tLvh}yF1jx(=LWa8)T-u^Co;0ta7*o~zeFU5WZ&WR z_V$@DA4)~|>0W%?VjF09V}For!*a6ogZk(+L`)Fj@@7@w=F8oro<5W5hnYr5HjgEt zJLEP-N-HT%f(0KDpA^*Hevf~X2DXq!6lqVGxJaK4c_YO`U4?#r^oe$qL*zYrhtv1^=4MD zzJ0mHe{%~ECLnIp(%?RM`9Ug7sYI7jZ((36zVEX!5*b9o70livNgV*cOVBX!!8^9% zS1_vrOtU#coE(X~j7D1t$N4V$8AOdbi3GFBQ;Rd<#rALU*CTyW?-B*we;`C{-Vb;t z8RGAZkSe(p{LB+qIGi(4Lg_sN_f5fz$F%t@yy)C=D^{Yq@!1YV2cVxjO&_P*9$K?j zZlCa`o=&q1Ea5CS^OK7xYI*SH)e%4&g#}p)$C_u?j8;3Xr}DmXbTpkwqtK_!rH?ck zu##qFH1}F&)$4CkN5$((=vU~Vpw-kO)5X5XJ{x(x-d)1!3_CJ`B-ywfLz|Z14w`S@ zxlcN27#TO@Jv7m1jFHSIX>=dEt(*?S38Xg>$+E{5aGe>WQxAnIU6$q`}eZzx{o?qmcTR#6%h{5BdgShx}Ea7kX z?u^!r2IcErkB?Z#|0v}f#Lv&i(7dNxN3ej=6-csv%3f%(kLXKJ2MTlniPB(vO zz3>#mb@REjL-D<++&M?|atJlGqCMw5z2PM_Bgzb@ML3n4qMi+y!ZASb8w2X=h~ck4 z5iW0h>}ck)DZR<@8{+$_mRc^tTJnWT8IZ8x?*KolVz~p7PMsnPHWqMXhfYAS zcb$t;>%{Hm)&7!ZpP1J`NBKx=llH_B_WOISxqLf^Cd2f$XVh@kXx_Gqs^{v}Rw?ry>iKVb1EsqTIuM!#>v*D6L^qMmeFD*XLMj&X zf^M{b?6nASCtMzUibJ)pkIqT9czsMve}A2X9}1mz%hJBqp-bDGV9G&`RWxdJ2OGqAx|e&Tn5u~{%IruMZ9rJ4ju$uH4+$P$-hcu3@oYey zXGxQJy|18Kvw_HFR2|M8@;94#$$6R&Z0}pBp5NL<{f*w3hL54sDEXLyW7F`O@)d-p&MO*WXiHU{n8X yVetR>o_~Y*{}ROiOFHLYWB$K~|BognlGYs3ZKNvw0S8y|V0HDNO7jC%tZ1 zNSN~P4v&e6xu!!?JthE-1RNLE`GqMzgN_K39ylae)OVdA+cEs`^AiqPY!4UmGqlK1 zCOuUd^re-<1b^)!mVx!RmrY9}1L8_o8~0ktN@Y~$y?O&6>8xkd-SDSb*? zwPx0Y%Mvyb-1l*R(TL58EUBMZdlAKz$AXRS7S}u$KCx&Y#I)C2ZoT5G0nHMkXSnq1 zTfJ1m^By)Y^l;Lu1!R#sP3&)mb@xyLo0lA3T?#%GunG6iE73fXWuD8y-(C&zk`4Sm z_l#2$ls>v10oN#<;8AqLZ^c%AMNt z*?|~%wjt~zA!6aw4Zlltd;aemb-<_VruP?Up8WY-MI{&HPkkh3u`c4$8h+xM*UTk| zso#UY(2Kq~udh;`rS*vZy?(fv0KMd!6D|C5(RyWQ=|jJUhS8r1Mn*<)Zrdp;ea@>| ztCuIoA%Ff3^V%Z#vn|h^6FI2C&q@UgFQrEZYxniJ&BD2PGAeXcRaFP4)?ah4P260A z3|!euFh`myACRG!{6wyXI4-C@{}bXX9xNTGPIGOq*kXNv(QBQC-Nw+{8$+F1qTZ9( zDtK_wnWiU2ACBfXO}xC9`mRw2dAiA9M%HfNu3D0q8V?UoXv=dud;7RCLVWjvj=cP9 zBO@bS1A}2{jy0N}tlye|5!c=xiWnl5K13cIF2pqj_@}YGAjH*lr$UXv$IqR9>$6f+ zUE#OyqGw=GP*S2Po2D@`GQuk$pa-tj8qSzeSjhjr*@E(ABqb&7930kmaSvQvT}8nf z_WfiUH`Uqbw0Nx6|!Xe_esA)f1vGg&G4s3~>5m#fQN6}_G&X;BH zDOMa)3r&@Uscn9o`kELM!vR0{{vj_PpK48UVd0annvYSj2?^IR;{*>rx^sEi*-GFg zGqk}qZuM|;nE!!WR(3Wo%cX*g7qZe3JV1U6%0<$xnn z;vu+ML_`E-QFrfZa$fCCa%{@0L=4-3-DHyWt7$Mpn+PVH1AY&_q+*7a|KIO4MooUT zKc-87Ez{+0esNzJvR(aMy1DO{Ur^AmD%6-6!7Og~yTn2T4%d=k8LF}$yEJ#}zAH_S zrK$B_{Cr2Wkf=M_KAly~+0*q;CA#Y^Z1ywhwJck8{bQvJt-+xo6%;TKUU+?b+s(?_ zS``HxF!uB3JRY6wyO+;YU}kD3c-J-=X?=HBLyj9OEA^K5+T|dN8Y#ki*rt6oQGEk$ zlj{)*qr)RaS0yzc`PYKJf8|Z3t<}+;e`qDw?Cl9tWWoscn>41X*ws5*I)z5ZU)J1@ zG%%nW!48u>%Gpv??CbBxSL0oWPh6mLN3D4+Wxe}`ZJvCKUhm))TpRqx?lR8D$Cniu zOv^4SGhO%fQBZ5flzTiGo+9svK!jn=R8&;tmX*1nVV#|wK~gUui`Pu4rc4Zm@g<(i z7Y@4xF^364nN+VbzxBk9~&*R!eOP|Yh#m=_~5*} zyrJE#%*@RAh30w_!MM0M+l`qPqXw_i#Kc5hb940O=H?^T2axU0UEg3k&FuM=r5j%y z)8Z3y$}z;oN3y?0%d7QRzqLj%i+XRq08X|1^O^=oT45lSPpup9GxX1QCS9xYte=oN z+QSe2{+-*=@ub#7u(GPkZZKaDl?ft{Pe4FT*t$#C)HEf%H+OSui~dp&KF8?fH#t4- zrB*DP4#F}+uwhF*%OhFO>*n;3zPGmaEF9j;MI7fab&YU9PE%L`1DSKU1jKN$=|;KL?&?TJinON+N-2^h4;a5OKy^<!9vol8TRbM7NQN$MY@axA^|J{+JQGz_e-X7F!wcUG= z8_`@#(m5&FLQ}rzzIv8~fq);AdJ~bXK8vAz+vVa@s~cA@PJKNG@h`0J=NxP% zxIvFV0!ei3`!h}O-KeBiZ?8cP9$Wv3+9rt}{IC3Kyicw;u#(kl3&VZaA|p(vz&x9=HL^2KX3oYALR@Txlf0h^SB=S)baVI45trq9iX%h zml}|s3FF8Z`&Lg5IPMfoQ0yUv();^%F4X{KzVp*c0y1S)RU}dPJz4L z4*%Y?%XaR)#K&_tdFoCF94x?ursVyWs-#ZBUUb~hgB{g~VV@J64Y2Y*yGkS@h3`IO z4{HH#OCO>zFf^p}`vj++^&i)&SG_;qN~me0?5Z6GuNjyZRV~{^xFr9KI*d@b9jb8K z|Ncve9Ic2--Of@D7ySCpU;G;cI5We1Kh&exOaR{QlpJNf1_^xqwFrL`;o!Z0!uoI8 z1z&D}P^dJAzj=BlW^(G;|Nb)NPeAy-H~q;9IbB@kpL{1TvgCL^Jxo{6Xp~?dA`Q9l zEKNqOFCmeM)|U{_{hy>@-($c0+V;kEC5zU!3A}I!X z3bIH~m1PZ&s>jWtx))SILjGc~=OSl^ot^0i94ZsPR%!Gj0e^GS}E7Hg2B&Rw5{mD7$77bsQU zIZfKL_ya9_F_s;9_@&ipvyB_E_jlT;(MQx7d+Qds1*3KH*R$8|0MPT`*4q2`?+>PF zk+~?;RmF_nw~<$6#VmfDng}2fHoashB`{z+gPqIw@r`#+U4uB6x}?{2;qVa7C9uxn zM&e}B>a7zJr#i;J`mWU~0|FDr*|;-gTu0s=BaXhDZ183hei^P`WRz7s6=00oo)bbE z0>WlzW7A_91!b7p{cRaFSZG+z$X{Ld$>tw*Sap)0q8$k z=U%`dWLEg>Ud^yrOG`_lC?X!fs0xeb(~Y~Mh_l0<#b43p7&C`zV`X;#3V=y>lBN!o zP$KrDBCMX{&iQEc@Cq6;iC^Fo71hg0b_qRq{(Pn1{$^vbd9_1|nfDyM)ytP_qS^46 zJGKYgOPeIJ&oP-;`Mf2RZQT=W0p*4O301rrDRW4x?<$>JSSSFb0N~o*WJy;LNp9eD zqL;bE;T59%T6U5{UpS*MCmby~+;8$Yj|rMXo< zW^QGbMY%@fMl16M&H+RANb#BpajBo!z}X=XI~~H^i^G_s$^om3jd^)I0mzin#<_T7 zx8=N?R!85tI0N3xXITF3Cjwt-B2BFG3JD1X7~Z8DMbz(aEl~JdU7b-FgMhY$#n*t% zm^2#zbNlDC@LXZ%mWDj!Lyl12Ltjb?@_C<(K ze!5rHg=Gs-2qxWZF6+3tTjc1knv)h#$7wrOWnXu6uyU;!GoOeMK_2;KWo7XI<^;eS zO2lLJsj26LyHTB69w$gyOEY0Yky8$bdmE@su;cGO7mX40@6u`8+ZO?j2q30l-QsPE zAyJtKbfcIBGG&aOfnk{jw)a{oicJ7scd%R_>NqI_@)sp@0oDe{S#51?-QG+X9`oK! zMO9S?fhh1GjAqTxzx3ZqnhFo1AWY)g1aJbVPggPK=)g;c2tex)fXR)MRFiA1%#Ptf zjisepVEdyvDcsn=)O}FaQ5<{~|9zafJ^;U9abO=nK+>N%$W#Zdyy7TosiSVtPn997}H_0rV2g?fA*(H) z@w2qdU}9p*jO4oH&fj){RZ16C;WF3$j#QAJ-)nic4AP>j~ zsBJ9lNb5WUe^2c~YJvS&73<&qwF{&%M@&(_y0jYQjRJHNFPus2)h8Dhm%7FY>gy&q zqp%r(UQD+zaG{yD-n6;$)_(Ah76PpCQ-Xs5cKW` zOF1}a7NBWBfnm>*OfUhBzz4D-B~k+pmYBpHl0(D7DxZCSvsbv)a@~9YFgtK#+5OD< zj?WpNg{_x=aYV&(Hg5N+8dbge3}^+#egTfeD-3PR^vFGsQ#sW1Dk0S_!e=3gfqcl~o0675EH_2lDj_G6l7?u>6hE z`}_MoJA($ImaP}EGBX$7oEPl*8FGyaZd~o4=2g0=ZruSYjfmYq?%rIA<)W^Z)-8B@ zS64hIc?XRgj6xn-Qe1z;k2+rO%NGzf(?Ivcn#D8 zgzak@pO}~r#DYAWYfs*atBC7-$DXT>fq`d_N_g*)H&?tGc$9xjniP?cee0+e$H z&weZs&{NsaU{au8)Cc^2EQ9P8VWXqdFCTHADME!6)5cQhh$M|swj6L|F~`Y5%6gf_ zUj1ITfAjsBUxT2*OqAU)ws)sGUc({id)Q~vO$ysKF!$F(Hyz|t)UiAuaRzfl_E54r zvtz@3i=jrF-rEzd-OvrB29W3g7agszjTvx`?;Njn6}9c-%;Ok99^%<)B|a1jPZtaK zf~rShvl~cH!Hj|7VZIv|TCMku0aHn6+RobZP>tu8{3Ba`x^nA%ZjO}oDh+Au$L~^0 zJoeTkQ114^7WE8Fvz+m*a8{ZmVr6%7a&lw5eztlF)3L9ip`o8)_6noujd8EfK@PQZ z3_ufuqtvCAI8D8#-}~Sr#Aj4bBd= z&&|#G60AWH-k=HtRm%BrH35Xwo#d^6nGo()T9Z^z`Zp@qfRd!bN~1QoaU0;qbWlf^ zBBj@Y*R7G|!&#~ctr{aTTOGo9ykW_+?52~Km6DWH;OM_%tc@*G zAHII#f*`;l05&Xw74@o#PhWt`<>u$3Kur;1eKk?12hg0aU;ObNK58WgM$QAWVK&g9fTOfDAN_et z+lnWKnIArs_FRkQq&|59^elh^^mDi;=pu8~6!rjYgNjhY-!}uLKOb1N(}CijS5!m@ z?Cu9h?Fy{b>E{(?8{iv2*oOWg07!8KfZ^6ObFA~#ON$Jt!<=wK($m$}_38&_ZpejV%jt&MzCKf<0iP@y3J9e_FkMPDC0s>eJjIH+l_MQAxzN4>Yi zq8Svmp(5iPfZu=8)~NKcAN{3~jJ$^I^#wS82V}%0Q1byk>O0t3*%?Kkm&$O0F~chn zupD&5rph4)Qo87A=|l75gJHd=PjiL4Bp$t%lXGm`iJwFsli!tsAXcZC0r-Qu#Pq3u zoO?KP-TlW|Za2~ta}{7Ll5l_c@vLN<#NiW=;9$r5-2mZi1K_?PM&!IJC^$qWPNARO z%U$F^e0X< zP8x>J*36<*XNjarf0BoQSwqcOl&IX4>TcNuXPQ9SkE=DVyqy1YiU{!=U>6ktjl7_x zg7}2j&^lpRT*E0y?#&zU8ud4ecNBRh^#$!8Cy{?exr2j)JTRC!a5x}LQ&Jy@&iE2F zSJ(0f!oqVN^%O1DgJ47$uhl`h0jB|Ae`PMgJaUQ%h?uUX=9h(3Uv&V~KH}y=%_n<$ zz6_iB3c#b7zD>XTOv(XqNARu$KGG;8yDOmMj zu)v@I5D|a|d3kt%raufI;I%c-YI_3OJMB1}j)jHARW|Ct=4eXySalu(h!3ikBr6Pd z7$j5jR@(8CT}=q5{K8qfwjUk;rp*B{xrgRy{0Ydm)PJ3L=Z%5}HhF;f=kz@TIsJu8 zH6HxOKNRSPfwJE`b5BBiSpU0aL*U(CV2Uy$p*7`n?lg3+4Q*_fd|vZ0#qwQ^<<{lm zW{{mFxzcRLitaz$KcB%ad+_8}_U{#a8wkm z@x^Ac^vR$qGT%u@F>M{}VRkpM6!!MHVYYzPDGPDI`5Jl^#_U{D|N9Yh3B~<#H1}#N zb*OdjpP$Sz(C`2Y*|jSgk?Cs#AezaUo#KZ&6N1RDi;c1j7oHsbux-Cle{-aH(e>@k zHN!TxlLuNIb23NH-@Y&e|(D(vkNE->RIT(LYL2homjNiN;v*fMVt#K zl$SnxwmBE6x_kK`dA|mmEbspCGG~hkjpvEmfye4?k-R^ugh=z#It+#2ts>rPs$YY1Te+G7$+oEx9pPBk zSK4r^Z3qz6E7Y&4yfxB%-*NeI+8sLIN`!{OdVJ-s;VTSMy(&9OCFGbS97C08GSlCk zRHsr9z5eQ!5_Wap(_Um~w&D?ah2$kK-*DieaNNuq79@&Y?(ObMiOb%K z(ul!1>-JyPa(|@IBFScT%0!Bs8^~mwetB&Nf>YcvG0y~TCG#rtZNoO$t^A_5_DV% zFI&>tk&=ox9V=v-+(d^R;_)uH1hdSc1J((_6bZrVlirqe4#hggmR8l4Tc^tARE0Eg zsV<6-1pIedo;h-Boc%Q?!8^g&7ZFvBl=ZiWHx^Gx%Xsso`ehW6`zKU*3k77`)wa zNSI=CzJRYIrm^9RLRokASH^* z%VOFqajNsiF&4+^O!07CZ>;;2xkgMsm0;u7Ppjh z+E+Yu_1LvU?$BG+x^K<~J~&ArIv=fyG-C4fIJTg??MD(q^}FwO`Z0sH#+_f0#tc3m zrs`3@(gu(2mv`1zuenb|T1DmhwNcp>KF#W|P|kbScd{k@isgfsbUzi+=GrB-V5*xfiGuPD#xX!UADvTr3z zwZWuZl}aSWWOBfyQcO430(-9IxfZ>ev;hbV(wrpY>K(dj3Sn42+pjgi-Y^v z99zP!nBHJDx@g@tbTOmIo_9(kFr#<(v!6Q|yRwnT6DhWKF0V}RcGOsJM`-}Pm9Osg za65$i)83~~6i3)ngkyvrE@^a($NVB7j>k8gaFf=Y6$ADLsuLb?l#pexovOK3$;%9* z-B&R}jdGD=8R0WaDniM*A6RktYQ*o-hjXgzv7B+qPFW8=sB76BJ*^xfXuiZco-@8a zmGi7q2_6|KK~TziaY4)IyH^%{cmfV@fFP^e9}Xk=7%uW5f7tRSyHstqb{go+jRyF< zJdJikk}foGRS*sDkJgYUVF@Q0Ekn2FgIlw`DRUlnIZ-v}%sF2B> z@(iC&MbD|C^c~MHVOgu|iG6-^)^&RQmwN{>4(6ESE{xU6r(Pc3HrMmypc-ziCn>OR zX@^%-C?N)f#NKV8U(CPMYr5vtlE1n`-*U0MI=0w7D342o=||$VbMvw}RtX%rW?OGg z)^gBatiJnETnRPM;2YK#Hi}`9Vmb>)`7tU6?b-BRD`iVv^7?TKBO|D+CeZ8kn`?=z zX3wOzsHg7p{IR$}fDE(aD+lvy>wdQ+Zx|O4QwKd$S`5S$V$+r)kHv1n>!pYOQ1S57 zZFA40DooEyc~eRHQX8|Xicx$|RKG1LF=M)1FpeeR;ddtL0+l)3UG1Bm17_8($x+C_ z86h^o1e4TV*H6twJ7>p+kbJ>CW}OeV3 zewVNjOSO2@tG@mzyzz1s#V@%UHII_7uqH?`$!-gfO zMlnt_saZjVTHmq?6FKvzj=sJbv{LDWJ#c|lQtneAz&4uuRp%&uq($;GawBJCXt96#`%)PX= zeWRx3#M`_bE_~9RMUO?YhxJ7fgx!xIL~NJOq;;i6XJ;tq+~xRV2a9;X(2sI&5Vt6? zoKJlLVttIw-8`{OsYBPN7i?+N?kjKAv8nwc&ODz97=58&48A5-OU9H98J~y{S4C+* z_;6?3oS$LBmz%Ym6dI?I=ddE};(gf8bU%Y*Ro>owH}`pON&459_NIPmz;E~a&c_PR zD`e41YP-*^w`LRAq(7iPDGfEgToY}4k?pPw+M3sa1ZhY1FV;fmul+VHATm?S-v zM?zz9wkcv@NVh*gJo;mmkgo!86Mm#e2up(T_vOBKv^g@$vS29YdUZa)KaSb*R$LRZn8NFad*MkHt;|sMm8s zNoJanF`5^*t~kxjnhzB?k4;PMbuksi~z+9=|T(r}_`(7(VXT zNZ*%*`II=Pe`R~MQ|jbupB6z)rITsp`LF1Dg5G}ZyMD<}dT5QObrnJIAL!byVB+KI zt!>FIXV0KdaTo6t+ib~WzEta@wGg6ddazFeXcB_*@l`BTTgWrh6C=PzrT1iVh(Pk< zARjp}=ygiNRtn@T0?)<^>6aWvyr9kK{v1`$={@Gbc1SC8Njg=tGso-$qR6bEwd}f& z|C1X})2Ck!HjuZ#ndYC4_g)v@PJN{~ZWvle6)HIyFeY>m`EN96kdLN&;`B3retDbP61?stO<&frmAdjm+pANM0?)cttrZB?-pfx#36oQ_DWMs_hH00X} z%GJcgE(O2MHKpiPR1T$Mb1tCqswSHzH1g;~pg&;b%$lnAO)utt_RX;o$^Y=-G@#Yq zGHl>qFe3(zm)j83ZH6!&rU+heuv`KIpBEQ}$){%l*>BDenkVz_^f)%SmLj3^HvVLUxgHoV2=LkxXk+V==ev6sC@_JIUMMK!f&-Wb10y1c zIhR^DFuMSzF`#FMk7tj`Pl5g&JMK{3UTr`8mR2_NVwTkbew}@=%yVjx=vV_sxlL3~ z^%+_V4D1Xe#RJBq*Y_M*{kOGTYE6I^{w*or&+qV5~Q;nX8mi8zSht(@a)!w`QVf#p!{zlKOgQ+RmLaX(r1gD88$9l#7 zsKjiH%#H!M`_XYh#elBqegqC^+gTAwVz!4h&KvgJYRS1^M7njonc$N5r9_SvwwZfW zxk#_}>7Lo~ei0%wa*D3Wxn&q=`8x$9_5s|nk0O@MH{7ANmi#{b%NMx>Bv~7bIxj~` zBeShj_mi^KQu5c4>(XcO%u+9cQ@u8Ye3tX9-B#}_ubelR&;Wx+2ZZJ*8}fnnMb-zI z?5Xl!e8KufyuH171=)DvysIy5@u0=iyMh)PqM|*D;%r+duJob(^|-j2caBKxi!)(O znUb!N!%2>UgTYt0d|cc5_UtoyKLxmL6^%A{hjH32_S{Moa}VWQS}pHJ;cK?dt0#)f z$|6viV4veTS47@-9r7UDOomGXqcYT*EBIg4sN~*~j2_RX|y1PrG$Zho8+5KHB6T zbSIo$2+s5%^YNhQ;6{mR->CbF$ilmkM4A1^MMjlIpa*#Horo!T^Ty9x#tcjtiHh1k zzJa_;7kUg864I!wM_k)w3{#q`*_*r3CJ*dc&s*TuOzY5>EQwv2XP?MCCUq9LwG9iZ z{+{1QHstQC40D_8ehtr zR_y7iAOTqqb78%e1F#NW*{elpRIXTPw)dJ;bA-?Y6wUBbE4 zDW0%gyKq!oY8lm2jXu_Z_ernw>$s|hfoAj0wlFg6c%;FqpdD8YN5u>H8Z>{PM~v^4 z8r3_P{_vM}0dpW&+})PuP(5>VA^2!zfi^YuJ}(a=8z$gz&-vWxq@6BloQUtx6Y9eN z@|q_y7(ML^C8f~-=jP*tU+|di_5w5NZ}AT_kwM!%CM8Yr3UfR%FehJ3@oDEV z+Fc`U^z)h{{Yz7kN7NCL&nub^=fXhO|0_M8EDA@MT=)&!`|}98zmOvma411OEKajK zI*h3V4QN@P>_95lR*mGVs=GG>HC90KM(;3-Ew&~(sPAe9o_KG?$P&+xS}KQShpB?G zsX9`sIVC#>J{os^dhp|VmyYv>CiFN8xk}_`d{*+@@HFJYOd#+7TqE?KGwA;x&E_Ao a4~F=?-RHS!2Y$s1fh(#j6hD0S=3fBk`T0ly diff --git a/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png b/tdesign-component/test/components/dialog/goldens/t_dialog_keyboard_portrait_light.png deleted file mode 100644 index 03281c03552d4b5a67e99e7b1bba035a4d70f8ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15750 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 x6uAXOUVkq~OPO z;EgnM?BUdSUGSEXVs)+m#4D#!v~Q2y`uZs_jV>Ls`zYja(uSR#osfi+R@dw8g@p)b zbPHPhYB@~0RX3+SQyezg4@RTW$W~%P%Umzh9H|%6jeVGdsWS#~7qpPKw6j<7VE(;~ z?7`X3$7g;$H9K+b!Z|%L1s-nh9EAhNVyj^K6}y8nCFDhR_Pj+a+d9y!=?S9dVj zL?wSW`3mBc8ro)q-5lZs8+HYmI~B6uf%jORtUfH7m~d_1eHJ0mxLqzn?F6$syRTI$ z9Y*!V^5I!&TAY+0OBsYoe>#{ML}TM{CgjHU?(X5FeiRx^D4Uulr|d0k@$J4lvVUni zN+Fh;gP@p+H%1ue*-LmxR)o2e^vgMGua!27kCFo|N3L=kcg%d+ z!VB`^;W3LuQU62NjH2gZ`EMPsfRX)w|N0LD{tpBG-%V-gyeE&=em^?3hXvoIhCo%d KRZ5kfzWi@wxH7{4 diff --git a/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart b/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart deleted file mode 100644 index 64f9f6670a..0000000000 --- a/tdesign-component/test/components/dialog/t_dialog_keyboard_golden_test.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:tdesign_flutter/tdesign_flutter.dart'; - -import '../../helpers/component_golden_fonts.dart'; - -void main() { - setUpAll(loadComponentGoldenFonts); - - for (final brightness in Brightness.values) { - for (final landscape in [false, true]) { - final direction = landscape ? 'landscape' : 'portrait'; - testWidgets('Dialog keyboard $direction ${brightness.name}', ( - tester, - ) async { - tester.view.physicalSize = landscape - ? const Size(812, 375) - : const Size(375, 812); - tester.view.devicePixelRatio = 1; - tester.view.padding = FakeViewPadding(top: landscape ? 46 : 24); - final keyboardHeight = landscape ? 248.0 : 300.0; - tester.view.viewInsets = FakeViewPadding(bottom: keyboardHeight); - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - addTearDown(tester.view.resetPadding); - addTearDown(tester.view.resetViewInsets); - - await tester.pumpWidget( - RepaintBoundary( - key: const ValueKey('keyboard-dialog'), - child: MaterialApp( - theme: componentGoldenTheme(brightness), - builder: (context, child) => Stack( - children: [ - child!, - Positioned( - left: 0, - right: 0, - bottom: 0, - height: keyboardHeight, - child: Material( - color: brightness == Brightness.light - ? const Color(0xffdce1e9) - : const Color(0xff26282c), - child: const Center(child: Text('Keyboard')), - ), - ), - ], - ), - home: Scaffold( - body: Builder( - builder: (context) => TButton( - onPressed: () => TDialog.show( - context, - dialog: const TDialog( - title: Text('Keyboard dialog'), - content: TInput(hintText: 'Input'), - actions: [ - TDialogAction(child: Text('Cancel')), - TDialogAction( - child: Text('Confirm'), - role: TDialogActionRole.primary, - ), - ], - ), - ), - child: const Text('Open'), - ), - ), - ), - ), - ), - ); - await tester.tap(find.text('Open')); - await tester.pumpAndSettle(); - if (landscape) { - await tester.ensureVisible(find.text('Confirm')); - await tester.pumpAndSettle(); - } - await expectLater( - find.byKey(const ValueKey('keyboard-dialog')), - matchesGoldenFile( - 'goldens/t_dialog_keyboard_${direction}_${brightness.name}.png', - ), - ); - }); - } - } -} diff --git a/tdesign-component/test/components/dialog/t_dialog_test.dart b/tdesign-component/test/components/dialog/t_dialog_test.dart index 705dae21dd..909be044b8 100644 --- a/tdesign-component/test/components/dialog/t_dialog_test.dart +++ b/tdesign-component/test/components/dialog/t_dialog_test.dart @@ -140,189 +140,7 @@ void main() { } }); - Future openDialog( - WidgetTester tester, - Widget dialog, { - bool useSafeArea = true, - }) async { - await tester.pumpWidget( - app( - Builder( - builder: (context) => TButton( - onPressed: () => TDialog.show( - context, - useSafeArea: useSafeArea, - dialog: dialog, - ), - child: const Text('打开测试弹窗'), - ), - ), - ), - ); - await tester.tap(find.text('打开测试弹窗')); - await tester.pumpAndSettle(); - } - group('TDialog 路由与结果', () { - for (final confirm in [false, true]) { - testWidgets('受限高度的 ${confirm ? '便捷' : 'Builder 包装'}弹窗仍可滚动到操作区', ( - tester, - ) async { - tester.view.physicalSize = const Size(800, 400); - tester.view.devicePixelRatio = 1; - tester.view.padding = const FakeViewPadding(top: 40); - tester.view.viewInsets = const FakeViewPadding(bottom: 280); - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - addTearDown(tester.view.resetPadding); - addTearDown(tester.view.resetViewInsets); - await openDialog( - tester, - confirm - ? const TConfirmDialog( - title: '输入', - contentWidget: TextField(), - buttonText: '确认受限弹窗', - ) - : Builder( - builder: (_) => const TDialog( - title: Text('输入'), - content: TextField(), - actions: [TDialogAction(child: Text('确认受限弹窗'))], - ), - ), - ); - expect(tester.takeException(), isNull); - await tester.ensureVisible(find.text('确认受限弹窗')); - await tester.pumpAndSettle(); - expect( - tester.getBottomLeft(find.text('确认受限弹窗')).dy, - lessThanOrEqualTo(120), - ); - await tester.tap(find.text('确认受限弹窗')); - await tester.pumpAndSettle(); - expect(find.byType(TDialog), findsNothing); - }); - } - - for (final useSafeArea in [false, true]) { - testWidgets('Expanded 自定义内容保留有限高度,useSafeArea=$useSafeArea', ( - tester, - ) async { - tester.view.physicalSize = const Size(400, 800); - tester.view.devicePixelRatio = 1; - tester.view.padding = const FakeViewPadding(top: 24, bottom: 34); - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - addTearDown(tester.view.resetPadding); - addTearDown(tester.view.resetViewInsets); - const panelKey = ValueKey('custom-panel'); - BoxConstraints? received; - Widget customContent() => Material( - child: SizedBox( - key: panelKey, - width: 300, - child: LayoutBuilder( - builder: (context, constraints) { - received = constraints; - return Column( - children: [ - const Text('自定义标题'), - Expanded( - child: ListView( - children: List.generate( - 12, - (index) => - SizedBox(height: 40, child: Text('项目 $index')), - ), - ), - ), - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('关闭自定义内容'), - ), - ], - ); - }, - ), - ), - ); - - await openDialog(tester, customContent(), useSafeArea: useSafeArea); - expect(tester.takeException(), isNull); - expect(received!.hasBoundedHeight, isTrue); - final originalSize = tester.getSize(find.byKey(panelKey)); - expect(originalSize.height, useSafeArea ? 742 : 800); - - tester.view.viewInsets = const FakeViewPadding(bottom: 300); - tester.view.padding = const FakeViewPadding(top: 24); - await tester.pumpAndSettle(); - expect(tester.takeException(), isNull); - expect(received!.hasBoundedHeight, isTrue); - expect( - tester.getSize(find.byKey(panelKey)).height, - useSafeArea ? 476 : 500, - ); - expect(tester.getBottomLeft(find.text('关闭自定义内容')).dy, lessThan(500)); - - tester.view.viewInsets = const FakeViewPadding(); - tester.view.padding = const FakeViewPadding(top: 24, bottom: 34); - await tester.pumpAndSettle(); - expect(tester.getSize(find.byKey(panelKey)), originalSize); - await tester.tap(find.text('关闭自定义内容')); - await tester.pumpAndSettle(); - expect(find.byKey(panelKey), findsNothing); - }); - } - - for (final useSafeArea in [false, true]) { - testWidgets('键盘弹出时操作区可见,useSafeArea=$useSafeArea', (tester) async { - tester.view.physicalSize = const Size(400, 800); - tester.view.devicePixelRatio = 1; - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - addTearDown(tester.view.resetViewInsets); - addTearDown(tester.view.resetPadding); - await openDialog( - tester, - const TDialog( - title: Text('输入'), - content: TextField(), - actions: [TDialogAction(child: Text('确认'))], - ), - useSafeArea: useSafeArea, - ); - final originalCenter = tester.getCenter(find.byType(TDialog)); - tester.view.viewInsets = const FakeViewPadding(bottom: 300); - await tester.pumpAndSettle(); - expect( - tester.getBottomLeft(find.text('确认')).dy, - lessThanOrEqualTo(500), - ); - expect( - tester.getCenter(find.byType(TDialog)).dy, - lessThan(originalCenter.dy), - ); - tester.view.viewInsets = const FakeViewPadding(); - await tester.pumpAndSettle(); - expect(tester.getCenter(find.byType(TDialog)), originalCenter); - tester.view.physicalSize = const Size(800, 400); - tester.view.padding = const FakeViewPadding(top: 40); - tester.view.viewInsets = const FakeViewPadding(bottom: 280); - await tester.pumpAndSettle(); - expect(tester.takeException(), isNull); - await tester.ensureVisible(find.text('确认')); - await tester.pumpAndSettle(); - expect( - tester.getBottomLeft(find.text('确认')).dy, - lessThanOrEqualTo(120), - ); - await tester.tap(find.text('确认')); - await tester.pumpAndSettle(); - expect(find.byType(TDialog), findsNothing); - }); - } - testWidgets('通过居中模态路由打开并返回 typed result', (tester) async { bool? result; await tester.pumpWidget( diff --git a/tdesign-component/tool/component_test_manifest.dart b/tdesign-component/tool/component_test_manifest.dart index b37ce73a1d..a223166c53 100644 --- a/tdesign-component/tool/component_test_manifest.dart +++ b/tdesign-component/tool/component_test_manifest.dart @@ -407,14 +407,6 @@ const componentTestManifests = [ ], exampleTests: ['test/dialog/dialog_page_test.dart'], visualTests: [ - VisualTestManifest( - name: 'Dialog keyboard', - workingDirectory: '.', - testFiles: [ - 'test/components/dialog/t_dialog_keyboard_golden_test.dart', - ], - kind: VisualTestKind.component, - ), VisualTestManifest( name: 'Dialog Popup Consumer', workingDirectory: '.', diff --git a/tdesign-site/site/docs/faq.md b/tdesign-site/site/docs/faq.md index 75dda8881a..860179ea6d 100644 --- a/tdesign-site/site/docs/faq.md +++ b/tdesign-site/site/docs/faq.md @@ -46,7 +46,7 @@ TD内置外观使用全局Token、组件Theme及公开实例配置。Material的 ## 弹层如何避让安全区? -`TPopup` 和 `TPickerPopup` 默认不避让安全区。设置 `useSafeArea: true` 会移动整个面板,面板背景也随之离开屏幕边缘;如需背景贴边,可保持默认配置,在内容中使用 `SafeArea` 避让需要的边。避免外层弹层与内部组件重复处理同一边的安全区;`TActionSheet` 命令式入口默认由弹层负责避让。`TPopup` 的键盘避让需要由业务组合处理;`TDialog.show` 会按键盘高度调整可用区域,标准 Dialog 在高度不足时可整体滚动,自定义内容仍获得有限高度约束。横屏和键盘弹出时,请在目标设备上验证内容是否被遮挡。 +`TPopup` 和 `TPickerPopup` 默认不避让安全区。设置 `useSafeArea: true` 会移动整个面板,面板背景也随之离开屏幕边缘;如需背景贴边,可保持默认配置,在内容中使用 `SafeArea` 避让需要的边。避免外层弹层与内部组件重复处理同一边的安全区;`TActionSheet` 命令式入口默认由弹层负责避让。请在目标设备上验证安全区是否符合预期。 ## 如何反馈问题或申请组件能力?