)]}'
{
  "commit": "c652b538194cc8dce5d826cc7a806908e43f9a9e",
  "tree": "987e4701c1bb0184f91aae4af2f129585c903f46",
  "parents": [
    "3667ffd1821dacdf1e4ca647756ef05e4ca01cab"
  ],
  "author": {
    "name": "Luke Memet",
    "email": "1598289+lukemmtt@users.noreply.github.com",
    "time": "Tue Nov 04 20:20:33 2025 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Nov 05 00:20:33 2025 +0000"
  },
  "message": "Fix `ReorderableList` items jumping when drag direction reverses mid-animation (#173241)\n\nWhen rapidly dragging items in a ReorderableList before animations\ncomplete, items would jump to their expected positions rather than\nsmoothly transitioning.\n\n## Problem\n\n\u003cp align\u003d\"center\"\u003e\n\u003cimg\nsrc\u003d\"https://github.com/user-attachments/assets/0efb250c-2960-4942-959f-59eccc20cefb\"\nalt\u003d\"demo2\" width\u003d\"250\"\u003e\n\u003c/p\u003e\n\nThe issue occurs when a reorder animation is interrupted by starting a\nnew drag operation. The interrupted animation would reset to the\nstarting position of the original animation rather than capturing the\ncurrent animated position, causing a visual jump.\n\n## Solution\n\nThis PR fixes the issue by:\n1. Storing the previous target offset before updating to a new target\n2. When an animation is interrupted, calculating the actual current\nposition based on the animation\u0027s progress\n3. Using this calculated position as the new starting point for the next\nanimation\n\n\u003cp align\u003d\"center\"\u003e\n\u003cimg\nsrc\u003d\"https://github.com/user-attachments/assets/c24e4834-1c6b-41c1-8f44-17b4c79e0993\"\nalt\u003d\"demo2\" width\u003d\"250\"\u003e\n\u003c/p\u003e\n\nThis PR is part of a series of `ReorderableList` enhancements I\u0027ve\ndeveloped for [TimeFinder](https://timefinder.app):\n- #172740\n- #172380\n- #172739\n- #172738\n\nFixes #173243\n\n## Code Changes\n\n```dart\n// Before\n_startOffset \u003d offset;\n\n// After  \nfinal double currentAnimValue \u003d Curves.easeInOut.transform(_offsetAnimation\\!.value);\nfinal Offset currentPosition \u003d Offset.lerp(_startOffset, previousTarget, currentAnimValue)\\!;\n_startOffset \u003d currentPosition;\n```\n\nThis ensures smooth transitions without visual jumping, making rapid\nreordering gestures feel more responsive and natural.\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 [Tree Hygiene] 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 listed at least one issue that this PR fixes in the description\nabove.\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 [migration\nguide] as needed.\n- [x] All existing and new tests are passing.\n- [x] The analyzer (`flutter analyze --flutter-repo`) does not report\nany problems on my PR.\n- [x] I am willing to follow-up on review comments in a timely manner.\n\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#overview\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md\n[Features we expect every widget to implement]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[migration guide]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md#create-a-migration-guide",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d1f5e58b8387d428263db793bda219f7e97ed3ae",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/reorderable_list.dart",
      "new_id": "6a78dd8b397f7b5e57d14da318544f764b68ef2a",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/reorderable_list.dart"
    },
    {
      "type": "modify",
      "old_id": "0b93550dbc017820c3c821536565b499e5698027",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/reorderable_list_test.dart",
      "new_id": "62cdf4e925ddce0883861184519e5b95b29b1db5",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/reorderable_list_test.dart"
    }
  ]
}
