用途:让 Flutter UI 在 TalkBack、VoiceOver、JAWS/NVDA 等读屏器,以及大字号、高对比度、减弱动画等系统设置下正常可用。优先使用自带语义的 Material/Cupertino 组件,仅在自绘或手势组件上补充 Semantics(或 Semantics.fromProperties)。若仓库已有 Semantics 辅助、无障碍测试工具或可点击控件约定,应沿用以避免重复标注。
主要能力与用法:自定义绘制或 GestureDetector/InkWell 需设置 label、角色标志(button/slider/textField)、tooltip/hint 与 onTap;角色用标志而非写进 label;瞬态状态用 liveRegion: true;container: true 可产生独立焦点停靠点。一个控件与其可见文本用 MergeSemantics 合并,但不可合并两个复选框或两个可点击子项。装饰性内容用 ExcludeSemantics,弹窗/Drawer 后方内容用 BlockSemantics 隐藏。
点击区域:可点击目标至少 48×48 逻辑像素(Cupertino 为 44.0),优先用 IconButton。纯图标控件需 tooltip 或 Semantics(label:, button: true);装饰性图标/图片分别用 semanticLabel 或 excludeFromSemantics: true。
文本缩放:用 MediaQuery.textScalerOf(context) 读取并 textScaler.scale(fontSize) 计算尺寸,禁用已废弃的 textScaleFactor。不得在 MaterialApp 根部关闭缩放。用 MediaQuery.accessibleNavigationOf、highContrastOf、disableAnimationsOf、textScalerOf 读取媒体查询标志。高对比度下设置 MaterialApp.highContrastTheme 与 highContrastDarkTheme;动画需读取 disableAnimationsOf,注意 iOS Reduce Motion 不会设置该标志。对比度至少 4.5:1(大号文字 3:1),不得仅用颜色传达状态。
测试与限制:用 tester.ensureSemantics()、meetsGuideline 检查(androidTapTargetGuideline、iOSTapTargetGuideline、labeledTapTargetGuideline、textContrastGuideline),最后 handle.dispose()。使用 sortKey 排读屏顺序,键盘 Tab 顺序应使用 FocusTraversalGroup/FocusTraversalOrder。需在真机用 TalkBack 与 VoiceOver 走查;Flutter Web 在 main() 中启用 SemanticsBinding.instance.ensureSemantics()。资料未提供具体价格、平台等信息。