Flutter SDK 没有提供细粒度的小部件来控制可访问性。相反,它包含一个名为Semantics 的类,其描述如下:
一个小部件,它用小部件含义的描述来注释小部件树。
如您所见,小部件并不真正关心具体的技术或功能,而是描述了它所包装的小部件的一般信息。也就是说,大部分功能都是为这两个屏幕阅读器量身定制的。
当您查看它的constructor 时,您可以了解它可以具有多少潜在属性(以及它可以支持的功能)。他们中的大多数最终都属于SemanticsProperties 类。
标签、价值和提示
语义小部件的一个常见用例是向小部件添加描述。在语义学中,我们有(除其他外)三个有用的字符串参数:
label,这是小部件的简要描述,
提示,这是对与小部件交互时将发生的动作的解释,
和 value,它提供了小部件状态的文本描述。
当然,您可能不需要所有这些,但在某些情况下,它们都适合。让我们看看他们这样做的一个案例:
Semantics(
label: 'Counter button',
hint: 'Press to increase',
value: '$_counter',
onTap: () { setState(() { _counter++; }); }
child: Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
);
对于以下文本(实际上也是一个按钮,因为我们指定了 onTap 处理程序),屏幕阅读器的用户将 - 假设 _counter 变量存储零,听到计数器按钮,零,按下以增加。
onCut、onCopy 和 onPaste
一组有用的属性可以在与文本字段交互时提供帮助:onCut、onCopy 和 onPaste 是在用户对文本字段执行匹配操作时执行的回调。您可以通过在用户操作文本时提供视觉或听觉反馈来使用它们来增强用户体验。
Semantics(
onCopy: () { debugPrint('Hey, where are you taking that?'); },
onCut: () { debugPrint('Give it back!'); },
onPaste: () { debugPrint('All right, do not do that again though.'); },
child: TextField(
controller: _textEditingController,
autocorrect: false,
),
);