)]}'
{
  "commit": "ae087b54395bfdf4a8aae5ab2c39e3ebcea560f5",
  "tree": "1ad5142573177805fed4fbce85918e918e02734a",
  "parents": [
    "f6061d0003a7a9e0cb30a45379c4c4bec0412c40"
  ],
  "author": {
    "name": "flutteractionsbot",
    "email": "154381524+flutteractionsbot@users.noreply.github.com",
    "time": "Wed Aug 19 09:43:26 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Aug 19 09:43:26 2026 +0000"
  },
  "message": "Revert: Cache `BoxShadow` paints in `_BoxDecorationPainter` (#191346)\n\nReverts: [Cache `BoxShadow` paints in\n`_BoxDecorationPainter`](https://github.com/flutter/flutter/pull/190194)\n\nInitiated by: @cbracken\n\nReason for reverting:   ```\n\nOriginal PR Author: @fa0311\n\nReviewed By: @victorsanni\n\nThe original PR description is provided below:\n\n`_BoxDecorationPainter._paintShadows` called `BoxShadow.toPaint()` —\nallocating a new `Paint` and native `MaskFilter` — for every shadow on\nevery paint, even though `BoxDecoration` is immutable and the painter is\nretained across frames by `RenderDecoratedBox`. This PR caches the\npaints on first use, the same way `_ShapeDecorationPainter` already\ncaches them in `_shadowPaints` (`shape_decoration.dart`).\n\nThe one observable difference matches existing `ShapeDecoration`\nbehavior: toggling `debugDisableShadows` between paints of a live\npainter is not picked up until the painter is recreated, which is\ndebug-only and already the case for `ShapeDecoration`.\n\nPart of #190187.\n\nThis is a behavior-preserving refactor; existing tests in\n`packages/flutter/test/painting/` and\n`packages/flutter/test/widgets/box_decoration_test.dart` cover this code\npath and pass, so I believe this qualifies as test-exempt.\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\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[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f113b43f788e4428597d3026b5fcec55b5beeb75",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/painting/box_decoration.dart",
      "new_id": "a9ca00e2c7408197bc7555cb6913671f50216250",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/painting/box_decoration.dart"
    }
  ]
}
