Support custom BoxBorder animation in BoxDecoration - #186348
Conversation
There was a problem hiding this comment.
Code Review
This pull request enables BoxDecoration to handle interpolation and scaling for custom BoxBorder subclasses by introducing a private _lerpBorder method that utilizes ShapeBorder.lerp. New tests verify this functionality using a custom border implementation. Feedback suggests simplifying nullable type checks and renaming a local variable to avoid shadowing and improve idiomatic Dart usage.
Piinks
left a comment
There was a problem hiding this comment.
Thanks for the update!
WDYT about staying consistent with the implementation of ShapeBorder.lerp and OutlinedBorder.lerp? Should follow the same pattern for the fallback? This could also avoid the is check, which aligns better with the Flutter style guide.
What do you think about simplifying the interpolation logic to this one-liner?
final ShapeBorder? result = b?.lerpFrom(a, t) ?? a?.lerpTo(b, t);
return result as BoxBorder? ?? (t < 0.5 ? a : b);This provides a resilient fallback and keeps the implementation consistent with the rest of the library. Let me know what you think!
Piinks
left a comment
There was a problem hiding this comment.
Thanks for addressing the feedback, this LGTM
b07fbfc to
f51f6dd
Compare
|
autosubmit label was removed for flutter/flutter/186348, because - The status or check suite Google testing has failed. Please fix the issues identified (or deflake) before re-applying this label. |
|
Google are legit but may just be slight color changes. |
Looks like these are just very slight changes to borders, therefore I've overridden the Google testing status. |
f51f6dd to
0c6edf4
Compare
flutter/flutter@1ac2e82...2a2a79d 2026-07-22 21270878+elliette@users.noreply.github.com Clear cached directional focus history on a non-directional focus request (flutter/flutter#187957) 2026-07-22 chris@bracken.jp ci: Include root pubspec.yaml in pub cache key (flutter/flutter#189826) 2026-07-22 6655696+guidezpl@users.noreply.github.com Remove codecov badge from README (flutter/flutter#189728) 2026-07-22 116356835+AbdeMohlbi@users.noreply.github.com Clean android engine/embedding tests (flutter/flutter#189276) 2026-07-22 50643541+Mairramer@users.noreply.github.com Add barrierBuilder support to showDialog and showGeneralDialog (flutter/flutter#187992) 2026-07-22 matt.boetger@gmail.com Fix Mockito dynamic agent loading warnings in Robolectric tests (flutter/flutter#189804) 2026-07-22 chris@bracken.jp [iOS] Remove dead RasterThreadMerger plumbing from platform views (flutter/flutter#189753) 2026-07-22 737941+loic-sharma@users.noreply.github.com Add OverlayPortal.overlayChildLayoutBuilder sample (flutter/flutter#188930) 2026-07-22 katelovett@google.com Automate recurring tasks via workflows - localizations (flutter/flutter#189750) 2026-07-21 chris@bracken.jp [iOS] Remove dead parameters and no-op overrides (flutter/flutter#189754) 2026-07-21 chris@bracken.jp [iOS] Inject DisplayLinkManager into FlutterViewController (flutter/flutter#189764) 2026-07-21 46920873+gabrimatic@users.noreply.github.com Support custom BoxBorder animation in BoxDecoration (flutter/flutter#186348) 2026-07-21 chingjun@google.com Rename CpuArch.x86_64 to CpuArch.x64 (flutter/flutter#189478) 2026-07-21 engine-flutter-autoroll@skia.org Roll Skia from 569534e9fa59 to 5e183e5aeac5 (3 revisions) (flutter/flutter#189795) 2026-07-21 engine-flutter-autoroll@skia.org Roll Dart SDK from 3b2f5ad7718d to 1e65011ee004 (4 revisions) (flutter/flutter#189791) 2026-07-21 jacksongardner@google.com Run delete-bot-branches.yaml on `pull_request_target` instead of `pull_request` so that we can access secrets. (flutter/flutter#189793) 2026-07-21 jmccandless@google.com Batch release directory correction (flutter/flutter#189738) 2026-07-21 brackenavaron@gmail.com [flutter_test][Test cross imports] Move TestWidgetsApp to flutter_test (flutter/flutter#189435) 2026-07-21 brunocorona.alcantar@gmail.com Fix null-deref/double-dispose in StretchingOverscrollIndicator (#189589) (flutter/flutter#189667) 2026-07-21 engine-flutter-autoroll@skia.org Roll Packages from 611899b to 8260a1e (10 revisions) (flutter/flutter#189782) 2026-07-21 chris@bracken.jp [iOS] Inject DisplayLinkManager into FlutterMetalLayer (flutter/flutter#189752) 2026-07-21 jason-simmons@users.noreply.github.com Derive the SkImage size used by ImageEncodingImpeller::ConvertDlImageToSkImage from the size of the underlying texture, not the size of the DlImage (flutter/flutter#189739) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC bmparr@google.com,stuartmorgan@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#12272) flutter/flutter@1ac2e82...2a2a79d 2026-07-22 21270878+elliette@users.noreply.github.com Clear cached directional focus history on a non-directional focus request (flutter/flutter#187957) 2026-07-22 chris@bracken.jp ci: Include root pubspec.yaml in pub cache key (flutter/flutter#189826) 2026-07-22 6655696+guidezpl@users.noreply.github.com Remove codecov badge from README (flutter/flutter#189728) 2026-07-22 116356835+AbdeMohlbi@users.noreply.github.com Clean android engine/embedding tests (flutter/flutter#189276) 2026-07-22 50643541+Mairramer@users.noreply.github.com Add barrierBuilder support to showDialog and showGeneralDialog (flutter/flutter#187992) 2026-07-22 matt.boetger@gmail.com Fix Mockito dynamic agent loading warnings in Robolectric tests (flutter/flutter#189804) 2026-07-22 chris@bracken.jp [iOS] Remove dead RasterThreadMerger plumbing from platform views (flutter/flutter#189753) 2026-07-22 737941+loic-sharma@users.noreply.github.com Add OverlayPortal.overlayChildLayoutBuilder sample (flutter/flutter#188930) 2026-07-22 katelovett@google.com Automate recurring tasks via workflows - localizations (flutter/flutter#189750) 2026-07-21 chris@bracken.jp [iOS] Remove dead parameters and no-op overrides (flutter/flutter#189754) 2026-07-21 chris@bracken.jp [iOS] Inject DisplayLinkManager into FlutterViewController (flutter/flutter#189764) 2026-07-21 46920873+gabrimatic@users.noreply.github.com Support custom BoxBorder animation in BoxDecoration (flutter/flutter#186348) 2026-07-21 chingjun@google.com Rename CpuArch.x86_64 to CpuArch.x64 (flutter/flutter#189478) 2026-07-21 engine-flutter-autoroll@skia.org Roll Skia from 569534e9fa59 to 5e183e5aeac5 (3 revisions) (flutter/flutter#189795) 2026-07-21 engine-flutter-autoroll@skia.org Roll Dart SDK from 3b2f5ad7718d to 1e65011ee004 (4 revisions) (flutter/flutter#189791) 2026-07-21 jacksongardner@google.com Run delete-bot-branches.yaml on `pull_request_target` instead of `pull_request` so that we can access secrets. (flutter/flutter#189793) 2026-07-21 jmccandless@google.com Batch release directory correction (flutter/flutter#189738) 2026-07-21 brackenavaron@gmail.com [flutter_test][Test cross imports] Move TestWidgetsApp to flutter_test (flutter/flutter#189435) 2026-07-21 brunocorona.alcantar@gmail.com Fix null-deref/double-dispose in StretchingOverscrollIndicator (#189589) (flutter/flutter#189667) 2026-07-21 engine-flutter-autoroll@skia.org Roll Packages from 611899b to 8260a1e (10 revisions) (flutter/flutter#189782) 2026-07-21 chris@bracken.jp [iOS] Inject DisplayLinkManager into FlutterMetalLayer (flutter/flutter#189752) 2026-07-21 jason-simmons@users.noreply.github.com Derive the SkImage size used by ImageEncodingImpeller::ConvertDlImageToSkImage from the size of the underlying texture, not the size of the DlImage (flutter/flutter#189739) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC bmparr@google.com,stuartmorgan@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Fixes #180297
BoxDecoration now preserves the existing specialized Border and BorderDirectional interpolation path, while custom BoxBorder subclasses use ShapeBorder.lerp. This lets custom borders provide their own interpolation hooks and avoids the AnimatedContainer assertion when animating a BoxDecoration with a custom border.
Tests: