├── .github └── workflows │ └── main.yaml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── assets ├── demo.gif └── min_demo.gif ├── benchmark └── benchmark.dart ├── example ├── README.md ├── android │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── example │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable-v21 │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values-night │ │ │ │ └── styles.xml │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── ios │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ ├── examples.dart │ ├── main.dart │ ├── ui │ │ ├── lang_page.dart │ │ ├── search_page.dart │ │ ├── test_page.dart │ │ └── ui.dart │ └── util │ │ ├── box.dart │ │ ├── highlight_text.dart │ │ ├── languages.dart │ │ └── util.dart ├── pubspec.yaml ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ └── Icon-512.png │ ├── index.html │ └── manifest.json └── windows │ ├── CMakeLists.txt │ ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake │ └── runner │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── resources │ └── app_icon.ico │ ├── run_loop.cpp │ ├── run_loop.h │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_window.cpp │ └── win32_window.h ├── lib ├── animated_list_plus.dart ├── src │ ├── custom_sliver_animated_list.dart │ ├── diff │ │ ├── diff.dart │ │ ├── diff_callback.dart │ │ ├── diff_delegate.dart │ │ ├── diff_model.dart │ │ ├── myers_diff.dart │ │ └── path_node.dart │ ├── handle.dart │ ├── implicitly_animated_list.dart │ ├── implicitly_animated_list_base.dart │ ├── implicitly_animated_reorderable_list.dart │ ├── reorderable.dart │ ├── src.dart │ ├── transitions │ │ ├── size_fade_transition.dart │ │ └── transitions.dart │ └── util │ │ ├── handler.dart │ │ ├── invisible.dart │ │ ├── key_extensions.dart │ │ ├── sliver_child_separated_builder_delegate.dart │ │ └── util.dart └── transitions.dart ├── pubspec.yaml └── test └── diff_test.dart /.github/workflows/main.yaml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | version: [3.7.0, 3.7.3] 15 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1 16 | with: 17 | flutter_channel: "stable" 18 | flutter_version: ${{ matrix.version }} 19 | test_recursion: true 20 | min_coverage: 0 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/* 17 | 18 | # Lock files 19 | pubspec.lock 20 | 21 | # Visual Studio Code related 22 | .classpath 23 | .project 24 | .settings/ 25 | .vscode/* 26 | version 27 | 28 | # packages file containing multi-root paths 29 | .packages.generated 30 | 31 | # Flutter/Dart/Pub related 32 | **/doc/api/ 33 | **/ios/Flutter/.last_build_id 34 | .dart_tool/ 35 | .flutter-plugins 36 | .flutter-plugins-dependencies 37 | .packages 38 | .pub-cache/ 39 | .pub/ 40 | build/ 41 | flutter_*.png 42 | linked_*.ds 43 | unlinked.ds 44 | unlinked_spec.ds 45 | .fvm/ 46 | 47 | # Android related 48 | **/android/**/gradle-wrapper.jar 49 | **/android/.gradle 50 | **/android/captures/ 51 | **/android/gradlew 52 | **/android/gradlew.bat 53 | **/android/local.properties 54 | **/android/**/GeneratedPluginRegistrant.java 55 | **/android/key.properties 56 | **/android/.idea/ 57 | *.jks 58 | 59 | # iOS/XCode related 60 | **/ios/**/*.mode1v3 61 | **/ios/**/*.mode2v3 62 | **/ios/**/*.moved-aside 63 | **/ios/**/*.pbxuser 64 | **/ios/**/*.perspectivev3 65 | **/ios/**/*sync/ 66 | **/ios/**/.sconsign.dblite 67 | **/ios/**/.tags* 68 | **/ios/**/.vagrant/ 69 | **/ios/**/DerivedData/ 70 | **/ios/**/Icon? 71 | **/ios/**/Pods/ 72 | **/ios/**/.symlinks/ 73 | **/ios/**/profile 74 | **/ios/**/xcuserdata 75 | **/ios/.generated/ 76 | **/ios/Flutter/App.framework 77 | **/ios/Flutter/Flutter.framework 78 | **/ios/Flutter/Flutter.podspec 79 | **/ios/Flutter/Generated.xcconfig 80 | **/ios/Flutter/app.flx 81 | **/ios/Flutter/app.zip 82 | **/ios/Flutter/.last_build_id 83 | **/ios/Flutter/flutter_assets/ 84 | **/ios/Flutter/flutter_export_environment.sh 85 | **/ios/ServiceDefinitions.json 86 | **/ios/Runner/GeneratedPluginRegistrant.* 87 | ios/Podfile.lock 88 | macos/Podfile.lock 89 | 90 | # Coverage 91 | coverage/ 92 | 93 | # Web related 94 | lib/generated_plugin_registrant.dart 95 | 96 | # Symbolication related 97 | app.*.symbols 98 | 99 | # Obfuscation related 100 | app.*.map.json 101 | 102 | # Exceptions to the above rules. 103 | !**/ios/**/default.mode1v3 104 | !**/ios/**/default.mode2v3 105 | !**/ios/**/default.pbxuser 106 | !**/ios/**/default.perspectivev3 107 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 108 | !/dev/ci/**/Gemfile.lock 109 | !.vscode/extensions.json 110 | !.vscode/launch.json 111 | !.idea/codeStyles/ 112 | !.idea/dictionaries/ 113 | !.idea/runConfigurations/ 114 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.5.2 2 | 3 | - Add `clipBehavior` argument 4 | 5 | ## 0.5.1 6 | 7 | - Add support for separator builder. You can now use `SliverImplicitlyAnimatedList.separated` or `ImplicitlyAnimatedReorderableList.separated`. 8 | 9 | ## 0.5.0 10 | 11 | - Minim supported Flutter version is 3.7.0 12 | - Use `.maybeOf` because `.of` is throwing a Exception in 3.7.0 13 | 14 | ## 0.4.5 15 | 16 | - Fix compatibility with new Flutter 3.7.0. They now also have an `AnimatedItemBuilder` type. 17 | 18 | ## 0.4.4 19 | 20 | - Fix README 21 | 22 | ## 0.4.3 23 | 24 | - Saved the old `implicitly_animated_reorderable_list` 25 | - Updated to Flutter 3 26 | 27 | - Saved the old `implicitly_animated_reorderable_list` 28 | - Updated to Flutter 3 29 | 30 | ## 0.4.2 31 | 32 | - **Fixed** #54, #72 33 | 34 | ## 0.4.0 35 | 36 | - **Added** NNBD support 37 | - **Fixed** #19, #49, #50, #52 38 | - **Improved** `Handle` is now able to capture pointer events which allows an `ImplicitlyAnimatedReorderableList` to be placed inside another scrollable without any workarounds. 39 | - **Breaking** Renamed `dragDuration` to `reorderDuration` 40 | - **Added** Field `liftDuration` 41 | - **Added** Field `settleDuration` 42 | 43 | ## 0.3.2 44 | 45 | - **Fixed** #47 46 | 47 | ## 0.3.1 48 | 49 | - **Fixed** #43 50 | - **Fixed** Changelog 51 | 52 | ## 0.3.0 53 | 54 | - **Fixed** #23 55 | 56 | ## 0.2.5 57 | 58 | - **Fixed** #14 59 | 60 | ## 0.2.1 61 | 62 | - **Improved** `ImplicitlyAnimatedList` now always uses the latest items, even if `listEquals()` is `true`. 63 | 64 | ## 0.2.0 65 | 66 | - **Added** support for headers and footers on the `ImplicitlyAnimatedReorderableList`. 67 | - **Added** `child` property on `Reorderable` that can be used instead off the `builder` that will use a default elevation animation instead of being forced to specify your own custom animation. 68 | 69 | ## 0.1.10 70 | 71 | - **Fixed** Bugs 72 | 73 | ## 0.1.4 74 | 75 | - **Improved** `Handle` is now scroll aware and only initiates a drag when the scroll position didn't change. 76 | - **Added** horizontal scrollDirection support for `ImplicitlyAnimatedReorderableList` 77 | 78 | ## 0.1.0 79 | 80 | - Initial release 81 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 bxqm 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Animated List Plus 2 | 3 | Resurrection of the discontinued `implicitly_animated_reorderable_list` Plugin. 4 | 5 | A Flutter `ListView` that implicitly calculates the changes between two lists using the `MyersDiff` algorithm and animates between them for you. The `ImplicitlyAnimatedReorderableList` adds reordering support to its items with fully custom animations. 6 | 7 |
8 |
9 |