【问题标题】:Move accessibility focus programmatically以编程方式移动可访问性焦点
【发布时间】:2019-12-07 22:31:31
【问题描述】:

是否可以在按下按钮时将辅助功能焦点(iOS 的 VoiceOver 和 Android 的 Talkback)移动到定义的小部件?

我已尝试在 Semantics package 中搜索,但找不到获取此信息的方法。

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

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

【问题讨论】:

  • 你试过 FocusNode 吗? FocusScope.of(context).requestFocus(_myFocusNode);
  • 我添加了有关小部件结构的详细信息,不幸的是我没有文本字段,所以我认为我不能将 FocusNode 设置为普通小部件。
  • 有一个名为 Focus 的小部件,您可以在其中附加一个 FocusNode、一个子小部件和一些回调。我是否正确理解您希望屏幕阅读器在按下按钮时自动读取焦点更改为的内容?我确实尝试创建类似于您使用 Focus 小部件描述的内容,并且焦点似乎根据打印语句而改变,但是 Talkback 的突出显示仍然存在,除非事后手动按下其他位置,否则不会大声读出任何内容。如果需要,我可以附上代码(尚未发布,因为我不确定它的正确答案)。
  • 我想要的是将对讲焦点从按钮更改为页面的开头(另一个小部件)。我尝试了您所描述的内容,但正如您所说,焦点没有改变。我正在寻找 Flutter 的原生 UIAccessibilityLayoutChangedNotification/AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 的等效项?

标签: flutter accessibility voiceover talkback


【解决方案1】:

简而言之,不,目前没有任何方法可以让您通过代码移动可访问性焦点。

参考https://stackoverflow.com/a/28481095/6668797 中提到的免责声明作为一些背景(尽管 Android 仍然允许我们这样做..)

免责声明:强制将注意力集中在 Activity 负载上,而不是在 顶栏总是(好吧,总是几乎不应该说),但是 真的,只是不要这样做。这是对各种 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
}

【讨论】:

    【解决方案2】:

    目前在 Flutter 中没有办法做到这一点。输入焦点和可访问性焦点是两个不同的东西。很多人似乎建议这样做:

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

    问题是这只改变了输入焦点。无障碍焦点,即 TalkBack 和 Voiceover 提供的绿/蓝/黑框,不会改变。

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

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

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

    如果您将焦点更改为表单字段,例如文本字段,则辅助功能焦点也会更新。

    在我的例子中,我使用的 FlatButton 几乎没有附加任何样式。显然,你必须让那个按钮 do 做点什么,但它至少能让你接近你想去的地方。

    哈克?绝对可以,但我现在没有更好的选择。

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 2015-12-30
      • 2021-10-30
      • 2023-03-02
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多