Material Chip 按钮语义
概述
#出于可访问性目的,Flutter 现在为所有可交互的 Material Chips 应用了 button 的语义标签。
背景
#可交互的 Material Chips(即 ActionChip、ChoiceChip、FilterChip 和 InputChip)现在在语义上被标记为按钮。但是,不可交互的信息 Chip 则不是。
将 Chips 标记为按钮有助于可访问性工具、搜索引擎和其他语义分析软件理解应用的含义。例如,这允许屏幕阅读器(如 Android 上的 TalkBack 和 iOS 上的 VoiceOver)将可点击的 Chip 播报为“按钮”,这有助于用户导航您的应用。在此更改之前,可访问性工具的用户体验可能不尽如人意,除非您通过手动为应用中的 Chip 小部件添加缺失的语义来实施变通方法。
变更说明
#用于描述其语义属性的、包装所有 Chip 类别的最外层 Semantics 小部件已得到修改。
以下更改适用于 ActionChip、ChoiceChip、FilterChip 和 InputChip。
button属性设置为true。enabled属性反映了 Chip 是否当前可点击(通过设置回调)。
这些属性的更改使可交互 Chips 的语义行为与其他 Material Buttons 的语义行为保持一致。
对于不可交互的信息 Chip:
button属性设置为false。enabled属性设置为null。
迁移指南
#您可能不需要执行任何迁移。此更改仅在您通过使用标记为 button: true 的 Semantics 小部件包装 Chip 的 label 字段中提供的小部件来解决 Material Chips 缺失 button 语义的问题时才会影响您。在这种情况下,内部和外部的 button 语义会发生冲突,导致在此更改引入后,按钮的可点击区域缩小到标签的大小。通过删除该 Semantics 小部件并用其子项替换,或者如果仍需要将其他语义属性应用于 Chip 的 label 小部件,则删除 button: true 属性来解决此问题。
以下代码片段使用 InputChip 作为示例,但相同的过程也适用于 ActionChip、ChoiceChip 和 FilterChip。
情况 1:删除 Semantics 小部件。
迁移前的代码
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
button: true,
child: Text('My Input Chip'),
),
);迁移后的代码
Widget myInputChip = InputChip(
onPressed: () {},
label: Text('My Input Chip'),
);情况 2:从 Semantics 小部件中删除 button:true。
迁移前的代码
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
button: true,
hint: 'Example Hint',
child: Text('My Input Chip'),
),
);迁移后的代码
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
hint: 'Example Hint',
child: Text('My Input Chip'),
),
);时间线
#已发布版本:1.23.0-7.0.pre
稳定版本:2.0.0
参考资料
#API 文档
ActionChipChipChoiceChipFilterChipInputChip- Material Buttons
- Material Chips
SemanticsSemanticsProperties.buttonSemanticsProperties.enabled
相关议题
- Issue 58010:InputChip 在 iOS 上未宣布任何无障碍操作
相关 PR