Flutter无障碍文本阅读插件accessible_text_view的使用

Flutter无障碍文本阅读插件accessible_text_view的使用

accessible_text_view 插件用于在 Flutter 应用中实现更完善的无障碍文本阅读功能。它通过渲染原生平台的 TextView 来解决在 Android 上嵌入链接时遇到的问题,并且在 iOS 上也提供了增强的无障碍选项。

可访问性问题解决

Android

目前,Flutter 的 TextRichText 组件无法正确处理链接,直到 Google Android 团队将 “link trait” 添加到其 AccessibilityNodeInfo 类中。现在,只有 URLSpanSpannableString 实例中才能在 TalkBack 中正确暴露链接。

理想的行为是整个文本被读取,每次遇到链接时会有轻微的停顿和独特的“点击声”。用户可以使用三指轻触来打开 TalkBack 菜单,在其中有一个包含链接的子菜单。由于缺乏公开的 Android API,当前 Flutter 框架无法实现这一功能。

然而,我也希望在此倡导为 Android 提供一种使这些元素单独可聚焦的选项,特别是对于较长的段落和文本块。这将帮助 TalkBack 用户不必听完整个文本。目前 Flutter 的 Text 组件实现支持将链接作为单独的焦点节点,但将其标记为按钮而不是链接。如果 Android 团队在公共 API 中提供“link trait”,使得 Flutter 引擎可以使用它而无需使用带有 Spannable 文本的 TextView,则可以通过允许 Semantics(link: true) 在 Flutter 的 TextRichTextTextSpan 中工作来轻松实现这一点。

iOS

幸运的是,UIKitUIAccessibilityTraits.link 属性,因此 Flutter 在 TextTextSpan 中的链接可以正确地被标注。此外,Flutter 默认使它们成为单独的焦点节点。不幸的是,iOS 用户可能会感到困惑,因为 Apple 已经将 UITextView 改进得更像 Android 的 TextView,即 UITextView 中的链接不再是单独的焦点节点。VoiceOver 用户必须更加高级并知道使用链接选择器来访问它们。似乎屏幕阅读器用户在遇到嵌入链接的文本时仍然处于黑暗之中,这是在本地应用中常见的现象,例如服务条款、支持联系信息、使用说明等。

为了弥合差距,我增强了 UITextView 的可访问性行为,允许开发人员根据他们的应用程序和文本视图中的文本量选择适当的行文。

此外,你还可以使用平台测试在 iOS 上使用 Flutter 实现,在 Android 上使用此组件,但我实现了原生视图以简化实现过程。

除此之外,你也可以简单地将链接嵌入 HTML,并使用数据自动检测(适用于 Android 和 iOS)来自动链接电话号码和电子邮件地址!

安装

flutter pub add accessible_text_view

使用示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 accessible_text_view 插件:

import 'package:flutter/material.dart';
import 'package:accessible_text_view/accessible_text_view.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int currentTabIndex = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Semantics(
          header: true,
          child: const Text('Flutter TextView example'),
        ),
      ),
      backgroundColor: Colors.black38,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: AccessibleTextView(
              html: """
              <p>这是一个可访问的 TextView 组件。其行为在 Android 上更准确,在 iOS 上更灵活。</p>
              <p>这是第二段。</p>
              <p>这是一个示例文本,包含电话号码 555-234-2345,电子邮件链接 test@example.com 和外部链接到 <a href="https://google.com">Google</a>。
              在 Android 上,TalkBack 应该用滴答声指示每个链接。
              在 iOS 上,VoiceOver 应该提供长按链接菜单。</p>
              <p>此组件不应用于长文本,因为它不是为长文本设计的。对于这种情况,请使用 Web 视图。</p>
            """,
              textColor: Colors.white,
              linkWeight: FontWeight.bold,
              linkColor: Colors.blueAccent,
              appearance: AccessibleTextViewAppearance.dark,
              fontSize: 14,
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter无障碍文本阅读插件accessible_text_view的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter无障碍文本阅读插件accessible_text_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


accessible_text_view 是一个用于 Flutter 的无障碍文本阅读插件,它可以帮助开发者在应用中更好地支持屏幕阅读器(如 TalkBack 或 VoiceOver)等无障碍功能。这个插件的主要目的是为文本内容提供更好的无障碍支持,确保视力障碍用户能够顺利地访问和理解应用中的文本信息。

安装

首先,你需要在 pubspec.yaml 文件中添加 accessible_text_view 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  accessible_text_view: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

accessible_text_view 插件提供了一个 AccessibleTextView 组件,你可以用它来替换普通的 Text 组件,以确保文本内容能够被屏幕阅读器正确识别。

import 'package:flutter/material.dart';
import 'package:accessible_text_view/accessible_text_view.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Accessible Text View Example'),
        ),
        body: Center(
          child: AccessibleTextView(
            text: 'Hello, this is an accessible text!',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
    );
  }
}

参数说明

AccessibleTextView 提供了多个参数,以便开发者根据需要自定义文本的显示和无障碍行为:

  • text: 要显示的文本内容,类型为 String
  • style: 文本的样式,类型为 TextStyle
  • textAlign: 文本的对齐方式,类型为 TextAlign
  • textDirection: 文本的方向,类型为 TextDirection
  • locale: 文本的区域设置,类型为 Locale
  • softWrap: 是否自动换行,类型为 bool
  • overflow: 文本溢出时的处理方式,类型为 TextOverflow
  • textScaleFactor: 文本的缩放比例,类型为 double
  • maxLines: 文本的最大行数,类型为 int
  • semanticsLabel: 语义标签,用于屏幕阅读器,类型为 String。如果未提供,则默认使用 text 作为语义标签。

示例:自定义语义标签

有时候,你可能希望屏幕阅读器读取的文本与实际显示的文本不同,这时可以使用 semanticsLabel 参数:

AccessibleTextView(
  text: 'Click here',
  semanticsLabel: 'Tap to open the settings page',
  style: TextStyle(fontSize: 18),
)
回到顶部