type
status
date
slug
summary
tags
category
icon
password
在移动应用开发中,无障碍(Accessibility, a11y) 设计至关重要,它可以让更多用户,包括视障人士、听障人士以及其他有特殊需求的用户,能够更方便地使用应用。Flutter 提供了一系列内置的无障碍特性和 Widgets 来提升应用的可访问性

1. Flutter 无障碍支持

Flutter 内置支持以下无障碍功能:
  • 语音朗读(Screen Readers):如 Android 的 TalkBack 和 iOS 的 VoiceOver
  • 高对比度模式
  • 动态字体缩放
  • 可操作性增强(例如更大触控区域)
  • 自定义无障碍标签

2. 关键无障碍 Widgets

2.1 Semantics(语义 Widget)

Semantics 是 Flutter 中最重要的无障碍 Widget,它用于向辅助技术(如屏幕阅读器)提供 UI 元素的语义信息。

示例:为按钮添加自定义无障碍描述

🔹 效果:当用户启用屏幕阅读器时,按钮会被朗读为 “提交按钮,点击以提交表单”。

2.2 ExcludeSemantics(隐藏语义)

有时,我们可能需要隐藏某些 UI 元素的语义,使屏幕阅读器忽略它们,例如装饰性图片。

示例:隐藏图片的语义

🔹 效果:屏幕阅读器不会朗读此图片,适用于纯装饰性图片。

2.3 MergeSemantics(合并语义)

Flutter 默认会将 RowColumn 等布局的子元素分开处理。如果你希望多个 Widget 作为一个整体提供语义信息,可以使用 MergeSemantics

示例:合并图标与文字的语义

🔹 效果:屏幕阅读器会朗读 “收藏” 而不是 “星星,收藏”。

2.4 SemanticsService(语义服务)

如果你希望在某些事件触发时,让设备朗读特定文本,可以使用 SemanticsService.announce

示例:在操作完成时朗读信息

🔹 效果:当 showMessage() 执行时,设备会朗读 “操作成功”。

3. 其他提升无障碍性的技巧

3.1 文字大小自适应

Flutter 提供 MediaQuery.textScaleFactor 让应用适应系统字体大小设置。

示例:确保文本可以调整大小

🔹 效果:用户修改系统字体大小时,文本大小会随之变化。

3.2 增大点击区域

有些 UI 组件的点击区域可能太小,影响操作。可以使用 GestureDetectorMaterialTapTargetSize 扩大点击范围。

示例:增大按钮点击区域

🔹 效果:即使按钮尺寸较小,用户仍然可以轻松点击。

3.3 颜色对比度

确保文本和背景色对比度足够高,以适应色盲用户。例如:
  • 浅色背景上使用深色文本
  • 避免使用颜色作为唯一信息传递方式
可以使用 HighContrast 模式进行测试,并利用工具检测对比度,如 Accessibility Scanner(Android)。

4. 如何测试无障碍功能?

4.1 启用屏幕阅读器

4.2 使用 Flutter Inspector

Flutter DevTools 提供 Semantics Overlay,可以可视化无障碍语义信息:
  1. 运行 flutter run --debug
  1. 在 Flutter DevTools 中启用 “Show Semantics” 选项

5. 总结

  • Flutter 内置支持无障碍特性,包括 语音朗读、高对比度、字体缩放
  • Semantics Widget 可用于 自定义屏幕阅读器描述,而 ExcludeSemantics 可以隐藏语义信息。
  • MergeSemantics合并多个 Widget 的语义,使屏幕阅读器更易理解 UI。
  • SemanticsService.announce让设备朗读特定信息
  • 提升无障碍体验的方法
    • 让文字适应 系统字体大小
    • 增大 点击区域
    • 确保 颜色对比度足够高
  • 可以使用 TalkBack、VoiceOver、Flutter DevTools 来测试应用的无障碍性。
通过这些技巧,你的 Flutter 应用将更加友好,适用于更广泛的用户群体。🚀