)]}'
{
  "commit": "61b9176d4e1ad2ee0b95cce02053cb34387bb255",
  "tree": "ceb01a64aed2a276023d3092a36fba2e987a1d60",
  "parents": [
    "c4effcedc39fa92f8f50fb992b970991f5339a68"
  ],
  "author": {
    "name": "chunhtai",
    "email": "47866232+chunhtai@users.noreply.github.com",
    "time": "Mon Jun 02 12:03:51 2025 -0700"
  },
  "committer": {
    "name": "dart-internal-monorepo",
    "email": "dart-internal-monorepo@dart-ci-internal.iam.gserviceaccount.com",
    "time": "Mon Jun 02 12:48:53 2025 -0700"
  },
  "message": "Adds radio group widget r2 (#168161)\n\n\u003c!--\nThanks for filing a pull request!\nReviewers are typically assigned within a week of filing a request.\nTo learn more about code review, see our documentation on Tree Hygiene:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md\n--\u003e\n\nprevious https://github.com/flutter/flutter/pull/167363\n\nI have to factor out abstract class for RadioGroupRegistry and\nRadioClient which are subclassed by RadioGroupState and RawRadio\nrespectively.\n\nI have to do this because the RadioListTile that has 2 focusnode one for\nlistTile and one for the radio it builds. The issue is that RadioGroup\u0027s\nkeyboard shortcut has to tightly couples with the focus node of each\nradio, but the radioListtile has to mute the radio\u0027s focusnode so it can\nact as one control under keyboard shortcut\n\nhttps://github.com/flutter/flutter/blob/d582b358092d736c79b43a43e9b68b83a779cb6c/packages/flutter/lib/src/material/radio_list_tile.dart#L484\n\nTherefore i abstract the out the logic of RadioGroup so that another\nwidget can participate by implementing the interface.\n\nfixes https://github.com/flutter/flutter/issues/113562\n\nmigration guide: https://github.com/flutter/website/pull/12080/files\n\n## Pre-launch Checklist\n\n- [ ] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [ ] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [ ] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [ ] I signed the [CLA].\n- [ ] I listed at least one issue that this PR fixes in the description\nabove.\n- [ ] I updated/added relevant documentation (doc comments with `///`).\n- [ ] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [ ] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [ ] 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[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\nhttps://dart.googlesource.com/external/github.com/flutter/flutter/+/d0058ec361fb773c53dde4303e05cabd3a10ca75\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "37da2aec3d91d783839b7598701ef862c0902772",
      "old_mode": 33188,
      "old_path": "DEPS",
      "new_id": "c6a7b590bbbdf207305b29bde2773a74cb34e1d2",
      "new_mode": 33188,
      "new_path": "DEPS"
    },
    {
      "type": "modify",
      "old_id": "e887af0066574e1bcbc3a3b78dcca77df1e12010",
      "old_mode": 33188,
      "old_path": "commits.json",
      "new_id": "42aea979107c2b61a83a141335af3d87eea4bce2",
      "new_mode": 33188,
      "new_path": "commits.json"
    }
  ]
}
