是否可以在按下按钮时将可访问性焦点(iOS上的VoiceOver和Android上的Talkback)移动到定义的窗口小部件?
我尝试在Semantics package中进行搜索,但找不到找到该方法的方法。
使屏幕阅读器从头开始重新启动语义树就足够了。
我有一个PageView
,包含3个页面和按钮,可以使用PageController
向后/向前移动。我想使用按钮(调用_pageController.animateToPage
)来更改焦点,将焦点移到页面的开头。
答案 0 :(得分:2)
简而言之,不,目前没有允许您通过代码移动可访问性焦点的方法。
将https://stackoverflow.com/a/28481095/6668797中的免责声明提及为某些背景(即使Android仍允许我们这样做。)
免责声明:强制将活动负载的重点放在除 顶部栏总是(好吧,几乎永远不应该说),但是 真的,只是不要这样做。它违反了各种WCAG 2.0 有关可预见性的规定,包括3.2.1和3.2.3 导航和上下文更改。您实际上可能是 通过执行此操作使您的应用无法访问。
Dart团队目前坚定地支持该规则,因此添加此功能并不是一个优先事项。
如果您确实希望通知用户现在可以看到另一个页面,则可以使用SemanticsService.announce()在执行某些操作后通知用户。例如,在onPageChanged
中设置
onPageChanged: (int page) {
// announce new page
}
答案 1 :(得分:0)
Flutter目前没有办法做到这一点。输入焦点和可访问性焦点是两件事。很多人似乎都建议这样做:
FocusScope.of(context).requestFocus(_myFocusNode);
问题在于,这只会更改输入焦点。可访问性焦点(即TalkBack和Voiceover提供的绿色/蓝色/黑色框)不会改变。
这就是为什么您可以使用打印语句来验证焦点,但框没有移动的原因。
截至目前,Flutter中无法更改可访问性焦点。这是创建真正可访问的应用程序的巨大监督和巨大障碍。
编辑 为了完整起见,我确实找到了一个丑陋的解决方法。
如果将焦点更改为表单字段(例如文本字段),则可访问性焦点也将更新。
在我的情况下,我使用的FlatButton几乎没有任何样式。显然,您必须使该按钮 do 起作用,但这至少会使您进入想要的位置。
强悍?绝对可以,但这是我目前所拥有的,而不是更好的选择。