lottie
Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player.
3.5.1
1000K downloads/mo
#29 most downloaded on pub.dev
xvrh/lottie-flutter
What this package is like to depend on
Last release 1 months ago
08 Jul 2026
Release timing varies
gaps range from 2 weeks to 8 months
Nearly every release is documented
notes for 59 of 59 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
68 releases · first in 2020
5 releases in the last 12 months
see the full history below
Release timeline
68 releases · Jan 2020 to Jul 2026Releases
latest 60 of 68-
3.5.108 Jul 2026Release notes
Open source →- Fix cropped fits (e.g. BoxFit.cover) ignoring alignment and always cropping from the top-left
- Fix the raster render cache serving the wrong crop when two animations shared a composition and size but differed in fit/alignment
Release notes
Open source →- Fix blank frames on pre-compositions using both time remapping and a time stretch
- Fix cropped fits (e.g.
BoxFit.cover) ignoringalignmentand always cropping from the top-left - Fix the raster render cache serving the wrong crop when two animations shared a composition and size but differed in fit/alignment
-
3.5.007 Jul 2026Release notes
Open source →- Throttle the auto-animation to the composition frame rate to reduce rebuilds
Release notes
Open source →- Throttle the auto-animation to the composition frame rate to reduce rebuilds
-
3.4.025 Jun 2026Release notes
Open source →- Add text animator range selectors (color, stroke, stroke width, tracking and opacity over an animated index/percent range)
- Add
ValueDelegate.pathto override a shape's outline at runtime - Experimental initial 3D layer support (X/Y rotation approximated as a 2D foreshortening)
- Render strokes correctly under skew by transforming the canvas instead of scaling the stroke width
- Only apply the parent alpha to matte layers
- Fix rounded corners not animating when the shape itself is static
- Fix a flash artifact on polygons with large strokes
- Improve
.lottie/.ziphandling: skipmanifest.jsonand normalize bundled image paths
Release notes
Open source →- Add text animator range selectors (color, stroke, stroke width, tracking and opacity over an animated index/percent range)
- Add
ValueDelegate.pathto override a shape's outline at runtime - Experimental initial 3D layer support (X/Y rotation approximated as a 2D foreshortening)
- Render strokes correctly under skew by transforming the canvas instead of scaling the stroke width
- Only apply the parent alpha to matte layers
- Fix rounded corners not animating when the shape itself is static
- Fix a flash artifact on polygons with large strokes
- Improve
.lottie/.ziphandling: skipmanifest.jsonand normalize bundled image paths
-
3.3.310 Apr 2026Release notes
Open source →- Apply the
ShapeFillfill type consistently when drawing and computing bounds inFillContent
Release notes
Open source →- Apply the
ShapeFillfill type consistently when drawing and computing bounds inFillContent
- Apply the
-
3.3.208 Sep 2025 -
3.3.110 Jan 2025 -
3.3.012 Dec 2024Release notes
Open source →- Requires Flutter 3.27 and fix lints.
- Add conditional imports to prevent importing dart:io on Web targets
Release notes
Open source →- Requires Flutter 3.27 and fix lints.
- Add conditional imports to prevent importing
dart:ioon Web targets
-
3.2.008 Dec 2024 -
3.1.314 Oct 2024 -
3.1.217 May 2024 -
3.1.113 May 2024Release notes
Open source →- Fix rounding-off error on progress calculation
- Allow missing end values for integer animations
-
3.1.021 Feb 2024Release notes
Open source →- Use
package:httpforLottie.network. This allows to drop dependency ondart:htmland be compatible withwasm. - Fix new lints
- Use
-
3.0.011 Jan 2024Release notes
Open source →- Add
renderCacheparameter.
Lottie.asset('assets/complex_animation.json', renderCache: RenderCache.raster, )Opt-in to a special render mode where the frames of the animation are lazily rendered and kept in a cache.
Subsequent runs of the animation are cheaper to render.There are 2 kinds of caches:
RenderCache.raster: keep the frame rasterized in the cache (as [dart:ui.Image]). Subsequent runs of the animation are very cheap for both the CPU and GPU but it takes a lot of memory.
RenderCache.drawingCommands: keep the frame as a list of graphical operations ([dart:ui.Picture]). Subsequent runs of the animation are cheaper for the CPU but not for the GPU.- Allow to load Telegram Stickers (.tgs)
Lottie.asset( 'sticker.tgs', decoder: LottieComposition.decodeGZip, )- Expose a hook to customize how to decode zip archives. This is useful for dotlottie archives (.lottie) when we want to specify a specific .json file inside the archive
Lottie.asset( 'animation.lottie', decoder: customDecoder, ); Future<LottieComposition?> customDecoder(List<int> bytes) { return LottieComposition.decodeZip(bytes, filePicker: (files) { return files.firstWhere((f) => f.name == 'animations/cat.json'); }); }-
Add
backgroundLoadingparameter toLottie.asset|network|file|memory.
IfbackgroundLoadingis true, the animation will be loaded in a background isolate.
This is useful for large animations that can take a long time to parse and block the UI work. -
Remove the name property from
LottieComposition -
imageProviderFactoryis not used in .zip file by default anymore. To restore the old behaviour, use:
Future<LottieComposition?> decoder(List<int> bytes) { return LottieComposition.decodeZip(bytes, imageProviderFactory: imageProviderFactory); } Lottie.asset('anim.json', decoder: decoder)- Disable gradient cache optimization when
ValueDelegate.gradientColoris used - Use
DefaultAssetBundle.ofinAssetLottiebefore fallback torootBundle - Add
BuildContextoptional parameter inLottieProvider.load - Fixed varying opacity stops across keyframes in the same gradient
- Fixed rounded corners for non-closed curves
- Implement auto-orient
- Add support for layer blend mode
- Require Flutter 3.16
- Add
-
3.0.0-alpha.422 Dec 2023 pre-release -
3.0.0-alpha.325 Nov 2023 pre-release -
3.0.0-alpha.222 Nov 2023 pre-release -
3.0.0-alpha.115 Nov 2023 pre-release -
2.7.020 Oct 2023Release notes
Open source →- Support loading Fonts from a zip file
- Fix a bug in Text with strokes
- Fix gradient interpolation for opacity stops beyond the last color stop
- Add color value callback to solid layer
-
2.6.008 Aug 2023Release notes
Open source →- Accept
List<int>instead ofUint8ListinLottieComposition.fromBytes - Stroke line cap defaults to butt instead of square
- Accept
-
2.5.017 Jul 2023Release notes
Open source →- Add layer-level opacity option to LottieOptions
- Fix TextLayer opacity calculation
-
2.4.002 Jun 2023Release notes
Open source →- Require minimum Dart 3.0.0 and Flutter 3.10.0
- Fix a parsing bug when the name property in RoundedCorner was null
-
2.3.206 Apr 2023 -
2.3.128 Mar 2023 -
2.3.014 Mar 2023Release notes
Open source →- Fixed a failed assertion (
dirty: is not true) when callingsetStateinsideonLoadedcallback. - Update point text y offset
- Makes static compositions not animate by default
- Fixed a failed assertion (
-
2.2.010 Jan 2023Release notes
Open source →Apply the latest fixes from Lottie-Android:
- Overhaul text layout
- Fix rounded corners modifying already rounded corners
- Support box position in Document Data
- Allow interpolating between gradients with different opacity stops
- Add support for gradient opacity stops
-
2.1.014 Dec 2022Release notes
Open source →- Improve the cache to ensure that there is not an empty frame each time we load an animation.
The methodAssetLottie('anim.json').load()returns aSynchronousFutureif it has been loaded previously. - Expose the
LottieCachesingleton. It allows to change the cache behaviour and clear the entries.
void main() { Lottie.cache.maximumSize = 10; Lottie.cache.clear(); Lottie.cache.evict(NetworkLottie('https://lottie.com/anim.json')); } - Improve the cache to ensure that there is not an empty frame each time we load an animation.
-
2.0.009 Nov 2022Release notes
Open source →- Breaking change: the lottie widget will be smaller if it relies on the intrinsic size of the composition.
Previously the lottie parser was automatically multiplying the size of the composition by
window.devicePixelRatio. This was incorrect as it results in a widget of a different size depending on the pixel ratio of the monitor. Furthermore, it created some bugs when the propertywindow.devicePixelRatiowas not available immediately at the start of the app (on Android release builds).The code can be adapted to specify explicitly the size of the animation with
width,heightandfitproperties.Scaffold( body: Center( child: Lottie.asset( 'assets/LottieLogo1.json', height: 800, fit: BoxFit.contain, ), ), ); -
1.4.314 Sep 2022 -
1.4.225 Aug 2022 -
1.4.103 Aug 2022 -
1.4.027 Jul 2022Release notes
Open source →- Added
filterQualityproperty to control the performance vs quality trade-off to use when drawing images
- Added
-
1.3.014 Apr 2022Release notes
Open source →- Added support for rounded corners on shapes and rects
- Add support for text in dynamic properties (
ValueDelegate)
Example:
Lottie.asset( 'assets/DynamicText.json', delegates: LottieDelegates(values: [ ValueDelegate.text( ['Text layer'], // The path to the text element to change value: 'The new text', ), ]), )- Improve stroke with offset
- Add support for reversed polystar paths
- Enforce order of operations to avoid rounding errors
-
1.2.214 Feb 2022 -
1.2.124 Sep 2021 -
1.2.019 Sep 2021Release notes
Open source →- Add support for gaussian blurs.
Example to blur some elements dynamically:
Lottie.asset( 'assets/AndroidWave.json', delegates: LottieDelegates(values: [ ValueDelegate.blurRadius( ['**'], // The path to the element to blur value: 20, ), ]), )- Add support for drop shadows.
Example to add a shadow dynamically:
Lottie.asset( 'assets/animation.json', delegates: LottieDelegates(values: [ ValueDelegate.dropShadow( ['**'], // The path to the elements with shadow value: const DropShadow( color: Colors.blue, direction: 140, distance: 60, radius: 10, ), ), ]), ) -
1.1.008 Jul 2021Release notes
Open source →- Add
errorBuildercallback to provide an alternative widget in case an error occurs during loading.
Lottie.network( 'https://example.does.not.exist/lottie.json', errorBuilder: (context, exception, stackTrace) { return const Text('😢'); }, );- Add
onWarningto be notified when a warning occurs during the animation parsing or painting. Previously the warnings where written in an internallogger.Lottie.asset('animation.json' onWarning: (warning) { _logger.info(warning); }, ); - Various bug fixes
- Add
-
1.0.108 Mar 2021 -
1.0.024 Feb 2021Release notes
Open source →- Migrate to null safety
- Fix some rendering bugs
- Add an image delegate to dynamically change images
- Allow to use an imageProviderFactory with a zip file
-
0.8.0-nullsafety.422 Feb 2021 pre-releaseNothing published for this version
-
0.8.0-nullsafety.308 Feb 2021 pre-releaseNothing published for this version
-
0.8.0-nullsafety.206 Feb 2021 pre-releaseNothing published for this version
-
0.8.0-nullsafety.106 Feb 2021 pre-releaseNothing published for this version
-
0.8.0-nullsafety.023 Jan 2021 pre-releaseNothing published for this version
-
0.7.023 Oct 2020 -
0.7.0+123 Oct 2020 -
0.6.024 Aug 2020Release notes
Open source →- Runs the animation at the frame rate specified in the json file (ie. An animation encoded with a 20 FPS will only
be paint 20 times per seconds even though the AnimationController will invalidate the widget 60 times per seconds).
A new propertyframeRateallows to opt-out this behavior and have the widget to repaint at the device frame rate (FrameRate.max). - Automatically add a
RepaintBoundaryaround the widget. SinceLottieanimations are generally complex to paint, aRepaintBoundarywill separate the animation with the rest of the app and improve performance. A new propertyaddRepaintBoundaryallows to opt-out this behavior. - Fix a bug where we would call
markNeedPaintwhen the animation was not changing. This removes unnecessary paints in animations with static periods.
- Runs the animation at the frame rate specified in the json file (ie. An animation encoded with a 20 FPS will only
be paint 20 times per seconds even though the AnimationController will invalidate the widget 60 times per seconds).
-
0.5.126 Jul 2020 -
0.5.026 Jul 2020Release notes
Open source →- Support loading animation from network in a web app
- Fix a couple of bugs with the web dev compiler
-
0.4.108 Jul 2020 -
0.4.001 Jun 2020Release notes
Open source →- Disable "Merge paths" by default and provide an option to enable them.
This is the same behavior as in Lottie-android.
Merge paths currently don't work if the the operand shape is entirely contained within the first shape. If you need to cut out one shape from another shape, use an even-odd fill type instead of using merge paths.
Merge paths can be enabled with:
Lottie.asset('file.json', options: LottieOptions(enableMergePaths: true)); - Disable "Merge paths" by default and provide an option to enable them.
-
0.4.0+110 Jun 2020 -
0.3.619 May 2020 -
0.3.518 May 2020 -
0.3.415 May 2020 -
0.3.303 Apr 2020 -
0.3.216 Mar 2020 -
0.3.112 Mar 2020 -
0.3.005 Mar 2020Release notes
Open source →- Add
LottieDelegatesa group of options to customize the lottie animation at runtime. ie: Dynamically modify color, position, size, text... of every elements of the animation. - Correctly display Linear and Radial Gradients
- Integrate latest changes from Lottie-android
- Add
-
0.3.0+105 Mar 2020 -
0.2.221 Feb 2020Release notes
Open source →- Add a [repeat] parameter to specify if the automatic animation should loop.
- Add the [animate], [reverse], [repeat] properties on
LottieBuilder - Fix bug with
onLoadedcallback when theLottieProvideris changed