)]}'
{
  "commit": "c999d99da3de146c58745f4c523ba7ea862c613e",
  "tree": "a4cd1d927336a02887d15eadfa7e0c298ffa4f77",
  "parents": [
    "a6570c3d2fa46daa4d820b8f556eedbdd41a84f6"
  ],
  "author": {
    "name": "Ishaq Hassan",
    "email": "ishaquehassan@gmail.com",
    "time": "Wed Sep 02 22:26:31 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Sep 02 22:26:31 2026 +0000"
  },
  "message": "Expose skipTraversal in FocusableActionDetector (#191308)\n\n`FocusableActionDetector` wraps a `Focus` widget internally and forwards\n`focusNode`, `autofocus`, `descendantsAreFocusable`, and\n`descendantsAreTraversable`, but not `skipTraversal`. That leaves no way\nto keep a `FocusableActionDetector` in the focus chain for key events\nwhile excluding it from focus traversal, even though the inner `Focus`\nalready supports exactly that.\n\nThis adds a `skipTraversal` parameter to `FocusableActionDetector` and\npasses it straight through to the inner `Focus`. It is typed `bool?` to\nmatch `Focus.skipTraversal`, so the default of `null` keeps the current\nbehavior and `Focus` still resolves it to `false` unless a focus node\noverrides it. The `skipTraversal` documentation on `Focus` is pulled\ninto a `{@template flutter.widgets.Focus.skipTraversal}` block so\n`FocusableActionDetector` can reuse it with `{@macro}`, the same\nconvention already used for `descendantsAreFocusable` and\n`descendantsAreTraversable`.\n\nThis revives #187356, which picked up an LGTM before it was auto closed\nafter 21 days without a reply. That earlier PR also bundled some\nunrelated private named parameter changes that drew review comments, so\nthis version is trimmed down to just the `skipTraversal` forwarding plus\nits test.\n\nFixes #187093\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [AI contribution guidelines] and understand my\nresponsibilities, or I am not using AI tools.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.\n\nIf you need help, consider asking for advice on the #hackers-new channel\non [Discord].\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview\n[AI contribution guidelines]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md\n[Features we expect every widget to implement]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Discord]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "82ee58e8495644c6f8c7493fb2f542eaeee09847",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/actions.dart",
      "new_id": "16c3a024a5f3d046a587b93ce6cd756135224476",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/actions.dart"
    },
    {
      "type": "modify",
      "old_id": "98445d0f9a06548dcd17caef2a2542a9201c9a89",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/focus_scope.dart",
      "new_id": "30efcdac20736baf99afc3fa7827e6511651d7f6",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/focus_scope.dart"
    },
    {
      "type": "modify",
      "old_id": "67da1da83215b37bcd7a3e251d6159b189091563",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/actions_test.dart",
      "new_id": "7a8a56460c971c8057c67239da6669b63af0be40",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/actions_test.dart"
    }
  ]
}
