Compare commits

..

3 Commits

Author SHA1 Message Date
9c266bb98b Fix bitwise comparaison on web (#274)
Fixes #273
2023-04-06 16:07:37 +02:00
cd4cc910c4 Use a default value for ShapeTrimPathType (#272) 2023-03-28 10:50:38 +02:00
92502f1358 Fix an assertion for null ShapeTrimPathType.type (#271)
Fixes #270
2023-03-27 22:44:26 +02:00
14 changed files with 326 additions and 414 deletions

View File

@ -1,3 +1,8 @@
## 2.3.2
- Fix a bug when running on the web due to [bitwise operations difference](https://dart.dev/guides/language/numbers#bitwise-operations).
## 2.3.1
- Fix an assertion for null `ShapeTrimPathType.type`.
## 2.3.0
- Fixed a failed assertion (`dirty: is not true`) when calling `setState` inside `onLoaded` callback.

View File

@ -1,8 +1,8 @@
include: package:flutter_lints/flutter.yaml
analyzer:
strong-mode:
implicit-casts: false
implicit-dynamic: false
language:
strict-casts: true
strict-inference: true
linter:
rules:
avoid_print: false

View File

@ -0,0 +1,243 @@
{
"layers": [
{
"ddd": 0,
"ty": 4,
"ind": 0,
"sr": 1,
"ip": 0,
"op": 180,
"st": 0,
"ks": {
"a": {
"k": [
0,
0
],
"a": 0
},
"p": {
"k": [
0,
0
],
"a": 0
},
"s": {
"k": [
100,
100
],
"a": 0
},
"r": {
"k": 0,
"a": 0
},
"o": {
"k": 100,
"a": 0
},
"sk": {
"k": 0,
"a": 0
},
"sa": {
"k": 0,
"a": 0
}
},
"ao": 0,
"bm": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"k": {
"c": false,
"i": [
[
0,
0
],
[
32,
-32
],
[
-64,
-64
],
[
64,
64
]
],
"o": [
[
64,
64
],
[
-32,
32
],
[
-64,
64
],
[
0,
0
]
],
"v": [
[
256,
128
],
[
256,
376
],
[
256,
256
],
[
128,
376
]
]
},
"a": 0
}
},
{
"ty": "st",
"lc": 2,
"lj": 2,
"ml": 0,
"o": {
"k": 100,
"a": 0
},
"w": {
"k": 5,
"a": 0
},
"c": {
"k": [
1,
0,
0,
1
],
"a": 0
}
},
{
"ty": "tr",
"a": {
"k": [
0,
0
],
"a": 0
},
"p": {
"k": [
0,
0
],
"a": 0
},
"s": {
"k": [
100,
100
],
"a": 0
},
"r": {
"k": 0,
"a": 0
},
"o": {
"k": 100,
"a": 0
},
"sk": {
"k": 0,
"a": 0
},
"sa": {
"k": 0,
"a": 0
}
}
]
},
{
"ty": "tm",
"s": {
"k": 0,
"a": 0
},
"e": {
"k": 50,
"a": 0
},
"o": {
"a": 1,
"k": [
{
"t": 0,
"i": {
"x": [
1
],
"y": [
1
]
},
"o": {
"x": [
0
],
"y": [
0
]
},
"s": [
0
],
"e": [
360
]
},
{
"t": 180,
"s": [
360
]
}
]
}
}
]
}
],
"v": "5.5.2",
"fr": 60,
"ip": 0,
"op": 180,
"w": 968,
"h": 1090,
"ddd": 0,
"assets": []
}

View File

@ -1,332 +0,0 @@
import 'dart:ui';
import 'package:flutter/material.dart' hide Image;
import 'package:flutter/material.dart' as material;
import 'package:lottie/lottie.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
showPerformanceOverlay: true,
home: Scaffold(body: _App()),
);
}
}
class _App extends StatefulWidget {
const _App({super.key});
@override
State<_App> createState() => __AppState();
}
class __AppState extends State<_App> {
static final _animation = AssetLottie('assets/LottieLogo1.json');
static final _size = const Size(500, 500);
CachedPictures? _cachedPictures;
CachedImages? _cachedImages;
@override
Widget build(BuildContext context) {
var cachedPictures = _cachedPictures;
var cachedImages = _cachedImages;
Widget animation;
if (cachedPictures != null) {
animation = PicturesPlayer(pictures: cachedPictures);
} else if (cachedImages != null) {
animation = ImagesPlayer(images: cachedImages);
} else {
animation = LottieBuilder(
lottie: _animation,
width: _size.width,
height: _size.height,
);
}
return ListView(
children: [
ElevatedButton(
onPressed: () async {
var watch = Stopwatch()..start();
var composition = await _animation.load();
var pictures = buildLottiePictures(composition, _size);
setState(() {
_cachedPictures = pictures;
});
print('Build cache in ${watch.elapsed}');
},
child: const Text('Create cached pictures'),
),
ElevatedButton(
onPressed: () async {
var watch = Stopwatch()..start();
var composition = await _animation.load();
var images = buildLottiePictures(composition, _size).toImages();
setState(() {
_cachedImages = images;
});
print('Build cache in ${watch.elapsed}');
},
child: const Text('Create cached pictures'),
),
ElevatedButton(
onPressed: () {
setState(() {
_cachedPictures = null;
_cachedImages = null;
});
},
child: Text('Clear cache'),
),
Container(
height: 300,
child: Stack(
children: [
for (var i = 0; i < 100; i++)
Positioned(left: i * 2.0, child: animation),
],
),
),
],
);
}
}
/*class CachedLottie extends StatefulWidget {
final LottieProvider provider;
const CachedLottie({super.key, required this.provider});
@override
State<CachedLottie> createState() => _CachedLottieState();
}
class _CachedLottieState extends State<CachedLottie>
with TickerProviderStateMixin {
AnimationController? _controller;
late Future<LottieComposition> _composition;
@override
void initState() {
super.initState();
_composition = widget.provider.load();
}
@override
void didUpdateWidget(covariant CachedLottie oldWidget) {
if (oldWidget.provider != widget.provider) {
_controller = null;
_composition = widget.provider.load();
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return FutureBuilder<LottieComposition>(
future: _composition,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
// TODO: Loading placeholder
return const SizedBox();
} else {
if (snapshot.hasError) return ErrorWidget(snapshot.error!);
var composition = snapshot.requireData;
var controller = _controller ??= AnimationController(vsync: this)
..duration = composition.duration
..repeat();
return _CachedLottie(
composition,
controller,
key: ValueKey(composition),
);
}
},
);
}
}
class _CachedLottie extends StatefulWidget {
final LottieComposition composition;
final AnimationController controller;
const _CachedLottie(this.composition, this.controller, {super.key});
@override
State<_CachedLottie> createState() => __CachedLottieState();
}
class __CachedLottieState extends State<_CachedLottie> {
late LottieDrawable _drawable;
@override
void initState() {
super.initState();
_drawable = LottieDrawable(widget.composition);
_drawable.draw(canvas, rect);
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraints) {});
}
}*/
class PicturesPlayer extends StatefulWidget {
final CachedPictures pictures;
PicturesPlayer({
super.key,
required this.pictures,
});
@override
State<PicturesPlayer> createState() => _PicturesPlayerState();
}
class _PicturesPlayerState extends State<PicturesPlayer>
with TickerProviderStateMixin {
late final _controller = AnimationController(
vsync: this, duration: widget.pictures.composition.duration)
..repeat();
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (context, _) {
var picture = widget.pictures.pictureAt(_controller.value);
return CustomPaint(
size: widget.pictures.size,
painter: _PicturePainter(picture),
);
},
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
class _PicturePainter extends CustomPainter {
final Picture picture;
_PicturePainter(this.picture);
@override
void paint(Canvas canvas, Size size) {
canvas.drawPicture(picture);
}
@override
bool shouldRepaint(covariant _PicturePainter oldDelegate) {
return picture != oldDelegate.picture;
}
}
class ImagesPlayer extends StatefulWidget {
final CachedImages images;
ImagesPlayer({
super.key,
required this.images,
});
@override
State<ImagesPlayer> createState() => _ImagesPlayerState();
}
class _ImagesPlayerState extends State<ImagesPlayer>
with TickerProviderStateMixin {
late final _controller = AnimationController(
vsync: this, duration: widget.images.composition.duration)
..repeat();
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (context, _) {
var image = widget.images.imageAt(_controller.value);
return material.RawImage(
image: image,
width: widget.images.size.width,
height: widget.images.size.height,
);
},
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
class CachedPictures {
final Size size;
final LottieComposition composition;
final List<Picture> pictures;
CachedPictures(this.size, this.composition, this.pictures)
: assert(pictures.length == composition.durationFrames.ceil());
Picture pictureAt(double progress) {
return pictures[(pictures.length * progress).round() % pictures.length];
}
CachedImages toImages() => CachedImages(
size,
composition,
pictures
.map((p) => p.toImageSync(size.width.round(), size.height.round()))
.toList());
}
class CachedImages {
final Size size;
final LottieComposition composition;
final List<Image> images;
CachedImages(this.size, this.composition, this.images)
: assert(images.length == composition.durationFrames.ceil());
Image imageAt(double progress) {
return images[(images.length * progress).round() % images.length];
}
}
CachedPictures buildLottiePictures(LottieComposition composition, Size size) {
assert(composition.startFrame <= composition.endFrame);
var drawable = LottieDrawable(composition);
var pictures = <Picture>[];
for (var i = composition.startFrame; i < composition.endFrame; i++) {
drawable.setProgress(i / composition.durationFrames);
var recorder = PictureRecorder();
var canvas = Canvas(recorder);
drawable.draw(canvas, Offset.zero & size);
var picture = recorder.endRecording();
pictures.add(picture);
}
return CachedPictures(size, composition, pictures);
}

View File

@ -19,6 +19,7 @@ class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
//showPerformanceOverlay: true,
home: Scaffold(
appBar: AppBar(
title: const Text('Lottie Flutter'),

View File

@ -6,13 +6,13 @@ PODS:
DEPENDENCIES:
- FlutterMacOS (from `Flutter/ephemeral`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
EXTERNAL SOURCES:
FlutterMacOS:
:path: Flutter/ephemeral
path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
SPEC CHECKSUMS:
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
@ -20,4 +20,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7
COCOAPODS: 1.11.3
COCOAPODS: 1.12.0

View File

@ -13,10 +13,10 @@ packages:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
@ -29,10 +29,10 @@ packages:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.3.0"
clock:
dependency: transitive
description:
@ -45,10 +45,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev"
source: hosted
version: "1.17.0"
version: "1.17.1"
convert:
dependency: transitive
description:
@ -143,10 +143,10 @@ packages:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.5"
version: "0.6.7"
lints:
dependency: transitive
description:
@ -169,15 +169,15 @@ packages:
path: ".."
relative: true
source: path
version: "2.3.0"
version: "2.3.2"
matcher:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev"
source: hosted
version: "0.12.13"
version: "0.12.15"
material_color_utilities:
dependency: transitive
description:
@ -190,50 +190,50 @@ packages:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.8.0"
version: "1.9.1"
path:
dependency: "direct main"
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.8.3"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9"
sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4
url: "https://pub.dev"
source: hosted
version: "2.0.13"
version: "2.0.14"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e"
sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7"
url: "https://pub.dev"
source: hosted
version: "2.0.23"
version: "2.0.24"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972
sha256: "818b2dc38b0f178e0ea3f7cf3b28146faab11375985d815942a68eee11c2d0f7"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.2.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a"
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
url: "https://pub.dev"
source: hosted
version: "2.1.9"
version: "2.1.10"
path_provider_platform_interface:
dependency: transitive
description:
@ -246,10 +246,10 @@ packages:
dependency: transitive
description:
name: path_provider_windows
sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d"
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.5"
platform:
dependency: transitive
description:
@ -270,10 +270,10 @@ packages:
dependency: transitive
description:
name: pointycastle
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c
url: "https://pub.dev"
source: hosted
version: "3.6.2"
version: "3.7.2"
process:
dependency: transitive
description:
@ -331,10 +331,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev"
source: hosted
version: "0.4.16"
version: "0.5.1"
typed_data:
dependency: transitive
description:
@ -368,5 +368,5 @@ packages:
source: hosted
version: "1.0.0"
sdks:
dart: ">=2.18.4 <3.0.0"
dart: ">=3.0.0-0 <4.0.0"
flutter: ">=3.3.0"

View File

@ -6,6 +6,7 @@ import '../../model/content/shape_data.dart';
import '../../model/cubic_curve_data.dart';
import '../../model/layer/base_layer.dart';
import '../../utils.dart';
import '../../utils/misc.dart';
import '../keyframe/base_keyframe_animation.dart';
import 'content.dart';
import 'shape_modifier_content.dart';
@ -219,18 +220,5 @@ class RoundedCornersContent implements ShapeModifierContent {
return shapeData;
}
/// Copied from the API 24+ AOSP source.
static int floorMod(int x, int y) {
return x - floorDiv(x, y) * y;
}
/// Copied from the API 24+ AOSP source.
static int floorDiv(int x, int y) {
var r = x ~/ y;
// if the signs are different and modulo not zero, round down
if ((x ^ y) < 0 && (r * y != x)) {
r--;
}
return r;
}
static int floorMod(int x, int y) => MiscUtils.floorModInt(x, y);
}

View File

@ -33,10 +33,10 @@ class LottieCompositionParser {
while (reader.hasNext()) {
switch (reader.selectName(_names)) {
case 0:
parameters.bounds.width = (reader.nextInt()).round();
parameters.bounds.width = reader.nextInt().round();
break;
case 1:
parameters.bounds.height = (reader.nextInt()).round();
parameters.bounds.height = reader.nextInt().round();
break;
case 2:
parameters.startFrame = reader.nextDouble();

View File

@ -43,7 +43,7 @@ class ShapeTrimPathParser {
return ShapeTrimPath(
name: name,
type: type!,
type: type ?? ShapeTrimPathType.simultaneously,
start: start!,
end: end!,
offset: offset!,

View File

@ -52,7 +52,7 @@ class MiscUtils {
}
static Color parseColor(String colorString,
{required Function(String) warningCallback}) {
{required void Function(String) warningCallback}) {
if (colorString.isNotEmpty && colorString[0] == '#') {
// Use a long to avoid rollovers on #ffXXXXXX
var color = int.parse(colorString.substring(1), radix: 16);
@ -71,12 +71,19 @@ class MiscUtils {
}
static int floorMod(double x, double y) {
return x.toInt() - y.toInt() * _floorDiv(x.toInt(), y.toInt());
var xInt = x.toInt();
var yInt = y.toInt();
return xInt - yInt * _floorDiv(xInt, yInt);
}
static int floorModInt(int x, int y) {
return x - y * _floorDiv(x, y);
}
static int _floorDiv(int x, int y) {
var r = x ~/ y;
var sameSign = (x ^ y) >= 0;
var sameSign = x.sign == y.sign;
var mod = x % y;
if (!sameSign && mod != 0) {
r--;

View File

@ -5,18 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9
sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214
url: "https://pub.dev"
source: hosted
version: "54.0.0"
version: "58.0.0"
analyzer:
dependency: "direct dev"
description:
name: analyzer
sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427"
sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27
url: "https://pub.dev"
source: hosted
version: "5.6.0"
version: "5.10.0"
archive:
dependency: "direct main"
description:
@ -37,10 +37,10 @@ packages:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
@ -53,10 +53,10 @@ packages:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.3.0"
clock:
dependency: transitive
description:
@ -69,10 +69,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev"
source: hosted
version: "1.17.0"
version: "1.17.1"
convert:
dependency: transitive
description:
@ -93,10 +93,10 @@ packages:
dependency: "direct dev"
description:
name: dart_style
sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4"
sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352"
url: "https://pub.dev"
source: hosted
version: "2.2.4"
version: "2.3.0"
fake_async:
dependency: transitive
description:
@ -143,10 +143,10 @@ packages:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.5"
version: "0.6.7"
lints:
dependency: transitive
description:
@ -159,10 +159,10 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev"
source: hosted
version: "0.12.13"
version: "0.12.15"
material_color_utilities:
dependency: transitive
description:
@ -175,10 +175,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.8.0"
version: "1.9.1"
package_config:
dependency: transitive
description:
@ -191,18 +191,18 @@ packages:
dependency: "direct main"
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.8.3"
pointycastle:
dependency: transitive
description:
name: pointycastle
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c
url: "https://pub.dev"
source: hosted
version: "3.6.2"
version: "3.7.2"
pub_semver:
dependency: transitive
description:
@ -260,10 +260,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev"
source: hosted
version: "0.4.16"
version: "0.5.1"
typed_data:
dependency: transitive
description:
@ -297,5 +297,5 @@ packages:
source: hosted
version: "3.1.1"
sdks:
dart: ">=2.18.0 <3.0.0"
dart: ">=3.0.0-0 <4.0.0"
flutter: ">=3.3.0"

View File

@ -1,6 +1,6 @@
name: lottie
description: Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player.
version: 2.3.0
version: 2.3.2
repository: https://github.com/xvrh/lottie-flutter
environment:

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB