Skip to content

[Google3 Bug]: [a11y] [Android] Talkback can't focus text sections with inline links on Android mobile web #174712

Open

Description

@math1man

Help us understand the severity of this issue

  • causing severe production issues e.g. malfunctions or data loss
  • blocking next binary release
  • blocking a client feature launch within a quarter
  • nice-to-have but does not block a launch within the next quarter

Steps to reproduce

  1. Create a flutter web app that creates a focusable inline link, using RichText. Our app uses https://pub.dev/packages/tagged_text for this, but the minimal repro below uses an even simpler implementation derived from it.
  2. Open the web app on an Android device in Chrome
  3. Enable Android TalkBack
  4. Enable Flutter accessibility
  5. Observe how Talkback interacts with the app

Steps 1-2 can also be achieved by opening https://dartpad.dev/?id=0239957b1f8428166a22f1565932b6f0&channel=main in Chrome on an Android device and running the dartpad.

Expected results

The non-link portion of the RichText should be focusable using talkback.

Actual results

Only the link is focusable.

Code sample

Code sample

Also available at https://gist.github.com/math1man/0239957b1f8428166a22f1565932b6f0 and https://dartpad.dev/?id=0239957b1f8428166a22f1565932b6f0&channel=main

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: ListView(
          children: [
            Text('Start'),
            Builder(
              builder: (context) => RichText(
                text: TextSpan(
                  children: [
                    TextSpan(text: 'Hello, World! '),
                    WidgetSpan(
                      alignment: PlaceholderAlignment.middle,
                      child: _Link(
                        text: 'Link',
                        onTap: () {
                          ScaffoldMessenger.of(
                            context,
                          ).showSnackBar(SnackBar(content: Text('Clicked')));
                        },
                      ),
                    ),
                  ],
                ),
              ),
            ),
            Text('End'),
          ],
        ),
      ),
    );
  }
}

class _Link extends StatelessWidget {
  const _Link({required this.text, this.onTap});

  final String text;
  final GestureTapCallback? onTap;

  @override
  Widget build(BuildContext context) {
    final colors = Theme.of(context).colorScheme;
    return Semantics(
      link: true,
      linkUrl: Uri.parse('#'),
      container: true,
      onTap: onTap,
      child: GestureDetector(
        onTap: onTap,
        child: Text(
          text,
          style: TextStyle(
            color: colors.primary,
            decoration: TextDecoration.underline,
            decorationColor: colors.primary,
          ),
        ),
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration
screen-20250829-120845.mp4

Logs

Logs: N/A

Flutter Doctor output

Doctor output: N/A

Activity

  1. math1man commented on Aug 29, 2025

    @math1man
    ContributorAuthor

    Internal bug b/440396024. Client: huggsy

  2. math1man commented on Aug 29, 2025

    @math1man
    ContributorAuthor

    Some added context: we do have a regular Android app where things work normally, but we also have a high-usage surface where our web app is accessed via an Android WebView, and that use case suffers from this bug same as running in Chrome.

  3. tirth-patel-nc commented on Sep 1, 2025

    @tirth-patel-nc
    Member

    @math1man thanks for the report. I’m seeing the same behavior with the latest SDK versions on web using mobile chrome (pixel 6a). However it doesn't replicate on Deskop-Web (Chrome) with Voice-Over in Mac.

    stable : 3.35.2
    master : 3.36.0-1.0.pre-366
    

    #129033 might be related.

  4. added
    has reproducible stepsThe issue has been confirmed reproducible and is ready to work on
    a: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)
    platform-webWeb applications specifically
    team-webOwned by Web platform team
    fyi-accessibilityFor the attention of Framework Accessibility team
    and removed
    in triagePresently being triaged by the triage team
    on Sep 1, 2025
  5. 25 remaining items

  6. mdebbar commented on Feb 27, 2026

    @mdebbar
    Contributor

    We are generating the following on the web:

    <flt-semantics id="flt-semantic-node-6" role="group" aria-label="Hello, World! " >
      <a id="flt-semantic-node-7" flt-tappable href="#">
        <flt-semantics id="flt-semantic-node-8" role="button" flt-tappable>Link</flt-semantics>
      </a>
    </flt-semantics>

    which looks fine and works fine with VoiceOver on my Mac.

    I'll see if I can try this on an Android device to test TalkBack behavior. The only thing that comes to mind is maybe TalkBack doesn't handle aria-label combined with children for some reason.

  7. self-assigned this
    on Mar 4, 2026
  8. flutter-triage-bot commented on Jul 8, 2026

    @flutter-triage-bot

    This issue is assigned to @flutter-zl but has had no recent status updates. Please consider unassigning this issue if it is not going to be addressed in the near future. This allows people to have a clearer picture of what work is actually planned. Thanks!

  9. added
    ⏳Bot is counting down the days until it unassigns the issue
    on Jul 8, 2026
  10. removed their assignment
    on Aug 7, 2026
  11. removed
    P1High-priority issues at the top of the work list
    on Aug 7, 2026
  12. removed
    ⏳Bot is counting down the days until it unassigns the issue
    on Aug 7, 2026
  13. added
    triaged-webTriaged by Web platform team
    P1High-priority issues at the top of the work list
    P2Important issues not at the top of the work list
    and removed
    P1High-priority issues at the top of the work list
    on Aug 12, 2026
  14. self-assigned this
    on Oct 26, 2026
  15. added
    P1High-priority issues at the top of the work list
    and removed
    P2Important issues not at the top of the work list
    on Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

P1High-priority issues at the top of the work lista: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)browser: chrome-androidonly manifests in Chrome on Androidcustomer: googleVarious Google teamscustomer: huggsy (g3)found in release: 3.35Found to occur in 3.35found in release: 3.36Found to occur in 3.36has reproducible stepsThe issue has been confirmed reproducible and is ready to work onp: material_uimaterial_ui package in flutter/packagesplatform-webWeb applications specificallyteam-webOwned by Web platform teamtriaged-webTriaged by Web platform team

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions