以编程方式移动可访问性焦点

时间:2019-07-30 13:44:59

标签: flutter accessibility voiceover talkback

是否可以在按下按钮时将可访问性焦点(iOS上的VoiceOver和Android上的Talkback)移动到定义的窗口小部件?

我尝试在Semantics package中进行搜索,但找不到找到该方法的方法。

使屏幕阅读器从头开始重新启动语义树就足够了。

我有一个PageView,包含3个页面和按钮,可以使用PageController向后/向前移动。我想使用按钮(调用_pageController.animateToPage)来更改焦点,将焦点移到页面的开头。

2 个答案:

答案 0 :(得分:2)

简而言之,不,目前没有允许您通过代码移动可访问性焦点的方法。

https://stackoverflow.com/a/28481095/6668797中的免责声明提及为某些背景(即使Android仍允许我们这样做。)

免责声明:强制将活动负载的重点放在除 顶部栏总是(好吧,几乎永远不应该说),但是 真的,只是不要这样做。它违反了各种WCAG 2.0 有关可预见性的规定,包括3.2.1和3.2.3 导航和上下文更改。您实际上可能是 通过执行此操作使您的应用无法访问。

http://www.w3.org/TR/WCAG20/#consistent-behavior

Dart团队目前坚定地支持该规则,因此添加此功能并不是一个优先事项。

如果您确实希望通知用户现在可以看到另一个页面,则可以使用SemanticsService.announce()在执行某些操作后通知用户。例如,在onPageChanged中设置

onPageChanged: (int page) {
  // announce new page
}

答案 1 :(得分:0)

Flutter目前没有办法做到这一点。输入焦点和可访问性焦点是两件事。很多人似乎都建议这样做:

FocusScope.of(context).requestFocus(_myFocusNode);

问题在于,这只会更改输入焦点。可访问性焦点(即TalkBack和Voiceover提供的绿色/蓝色/黑色框)不会改变。

这就是为什么您可以使用打印语句来验证焦点,但框没有移动的原因。

截至目前,Flutter中无法更改可访问性焦点。这是创建真正可访问的应用程序的巨大监督和巨大障碍。

编辑 为了完整起见,我确实找到了一个丑陋的解决方法。

如果将焦点更改为表单字段(例如文本字段),则可访问性焦点也将更新。

在我的情况下,我使用的FlatButton几乎没有任何样式。显然,您必须使该按钮 do 起作用,但这至少会使您进入想要的位置。

强悍?绝对可以,但这是我目前所拥有的,而不是更好的选择。