Compare commits

..

1 Commits

Author SHA1 Message Date
27b2ec471f Add errorBuilder 2020-10-12 22:07:03 +02:00
239 changed files with 1730 additions and 12546 deletions

View File

@ -10,7 +10,7 @@ jobs:
name: Flutter analyze
strategy:
matrix:
flutter: ['beta']
flutter: ['stable', 'dev']
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
@ -33,17 +33,3 @@ jobs:
"and check in all changes" \
&& exit 1)
shell: bash
build_web_version:
name: Check that the web version compile
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
channel: 'beta'
- run: flutter config --enable-web
- run: flutter precache web
- run: flutter pub get
working-directory: example
- run: flutter build web
working-directory: example

View File

@ -10,11 +10,12 @@ jobs:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
channel: 'beta'
channel: 'stable'
- run: flutter pub get
- run: flutter pub run tool/publish/comment_dependency_overrides.dart
- run: flutter pub get
- run: flutter pub run tool/publish/check_version.dart ${GITHUB_REF}
- run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF}
- run: flutter pub run tool/publish/check_version.dart ${{ env.RELEASE_VERSION }}
- name: Setup credentials
run: |
mkdir -p $FLUTTER_HOME/.pub-cache

View File

@ -1,18 +1,3 @@
## [1.0.0]
- 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.7.1]
- Fix a crash for some lottie file with empty paths.
## [0.7.0+1]
- Fix Flutter Web compilation error
## [0.7.0]
- Performance improvement for complex animations.
## [0.6.0]
- 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).

View File

@ -8,7 +8,7 @@ animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-we
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
It works on Android, iOS, macOS, linux, windows and web.
It works on Android, iOS and macOS and web.
## Usage
@ -64,7 +64,7 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late final AnimationController _controller;
AnimationController _controller;
@override
void initState() {
@ -137,7 +137,7 @@ class MyWidget extends StatefulWidget {
}
class _MyWidgetState extends State<MyWidget> {
late final Future<LottieComposition> _composition;
Future<LottieComposition> _composition;
@override
void initState() {
@ -176,7 +176,7 @@ a specific position and size.
class CustomDrawer extends StatelessWidget {
final LottieComposition composition;
const CustomDrawer(this.composition, {Key? key}) : super(key: key);
const CustomDrawer(this.composition, {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -8,7 +8,7 @@ animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-we
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
It works on Android, iOS, macOS, linux, windows and web.
It works on Android, iOS and macOS and web.
## Usage

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

View File

@ -1,3 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

View File

@ -23,7 +23,7 @@ class __PageState extends State<_Page> {
void initState() {
super.initState();
SchedulerBinding.instance!.addPostFrameCallback((_) => _showLoader());
SchedulerBinding.instance.addPostFrameCallback((_) => _showLoader());
}
void _showLoader() {

View File

@ -6,7 +6,7 @@ void main() async {
}
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -9,7 +9,7 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late final AnimationController _controller;
AnimationController _controller;
@override
void initState() {

View File

@ -17,7 +17,7 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late final AnimationController _controller;
AnimationController _controller;
@override
void initState() {
@ -86,7 +86,7 @@ class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
],
),
const SizedBox(height: 30),
ElevatedButton(
RaisedButton(
child: Text('Loop between frames'),
onPressed: () {
// Loop between 2 specifics frames
@ -97,7 +97,7 @@ class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
min: start,
max: stop,
reverse: true,
period: _controller.duration! * (stop - start),
period: _controller.duration * (stop - start),
);
},
),

View File

@ -22,7 +22,7 @@ class MyWidget extends StatefulWidget {
}
class _MyWidgetState extends State<MyWidget> {
late final Future<LottieComposition> _composition;
Future<LottieComposition> _composition;
@override
void initState() {
@ -57,7 +57,7 @@ class _MyWidgetState extends State<MyWidget> {
class CustomDrawer extends StatelessWidget {
final LottieComposition composition;
const CustomDrawer(this.composition, {Key? key}) : super(key: key);
const CustomDrawer(this.composition, {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -23,7 +23,7 @@ class MyWidget extends StatefulWidget {
}
class _MyWidgetState extends State<MyWidget> {
late final Future<LottieComposition> _composition;
Future<LottieComposition> _composition;
@override
void initState() {

View File

@ -8,7 +8,7 @@ void main() async {
}
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
_AppState createState() => _AppState();
@ -50,7 +50,7 @@ class _AppState extends State<App> with TickerProviderStateMixin {
value: _useDelegates,
onChanged: (newValue) {
setState(() {
_useDelegates = newValue!;
_useDelegates = newValue;
});
},
),

View File

@ -7,14 +7,14 @@ void main() async {
}
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> with TickerProviderStateMixin {
late final TextEditingController _textController;
TextEditingController _textController;
@override
void initState() {

View File

@ -6,14 +6,14 @@ void main() async {
}
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> with TickerProviderStateMixin {
late final AnimationController _animationController;
AnimationController _animationController;
bool _showAnimation = true;
@override

View File

@ -9,14 +9,14 @@ void main() async {
}
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> with TickerProviderStateMixin {
late final Future<LottieComposition> _composition;
Future<LottieComposition> _composition;
@override
void initState() {
@ -35,9 +35,9 @@ class _AppState extends State<App> with TickerProviderStateMixin {
body: FutureBuilder<LottieComposition>(
future: _composition,
builder: (context, snapshot) {
if (snapshot.hasError) return ErrorWidget(snapshot.error!);
if (snapshot.hasError) return ErrorWidget(snapshot.error);
if (!snapshot.hasData) return CircularProgressIndicator();
return _LottieDetails(snapshot.data!);
return _LottieDetails(snapshot.data);
},
),
),
@ -48,7 +48,7 @@ class _AppState extends State<App> with TickerProviderStateMixin {
class _LottieDetails extends StatefulWidget {
final LottieComposition composition;
const _LottieDetails(this.composition, {Key? key}) : super(key: key);
const _LottieDetails(this.composition, {Key key}) : super(key: key);
@override
_LottieDetailsState createState() => _LottieDetailsState();
@ -56,7 +56,7 @@ class _LottieDetails extends StatefulWidget {
class _LottieDetailsState extends State<_LottieDetails>
with TickerProviderStateMixin {
late final AnimationController _controller;
AnimationController _controller;
@override
void initState() {
@ -87,15 +87,15 @@ class _LottieDetailsState extends State<_LottieDetails>
title: Text('Composition duration'),
trailing: Text(widget.composition.durationFrames.toStringAsFixed(1)),
),
ElevatedButton(
RaisedButton(
child: Text('touchDownEnd - touchUpCancel'),
onPressed: () => _playBetween('touchDownEnd', 'touchUpCancel'),
),
ElevatedButton(
RaisedButton(
child: Text('touchDownStart - touchDownEnd'),
onPressed: () => _playBetween('touchDownStart', 'touchDownEnd'),
),
ElevatedButton(
RaisedButton(
child: Text('touchDownEnd - touchUpEnd'),
onPressed: () => _playBetween('touchDownEnd', 'touchUpEnd'),
),
@ -112,8 +112,8 @@ class _LottieDetailsState extends State<_LottieDetails>
}
void _playBetween(String marker1, String marker2) {
var start = widget.composition.getMarker(marker1)!.start;
var end = widget.composition.getMarker(marker2)!.start;
var start = widget.composition.getMarker(marker1).start;
var end = widget.composition.getMarker(marker2).start;
_controller.value = start;
_controller.animateTo(end,

View File

@ -1,63 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late final AnimationController _controller;
int _repeatIndex = 0;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this)
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
setState(() {
_repeatIndex++;
});
if (_repeatIndex < 5) {
_controller.reset();
_controller.forward();
}
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView(
children: [
Lottie.asset(
'assets/AndroidWave.json',
controller: _controller,
width: 150,
height: 150,
onLoaded: (composition) {
// Configure the AnimationController with the duration of the
// Lottie file and start the animation.
_controller.duration = composition.duration;
_controller.forward();
},
),
Center(child: Text('Repeat: $_repeatIndex')),
],
),
),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}

View File

@ -12,7 +12,7 @@ void main() async {
}
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
_AppState createState() => _AppState();
@ -20,7 +20,7 @@ class App extends StatefulWidget {
class _AppState extends State<App> with TickerProviderStateMixin {
int _index = 0;
late final AnimationController _animationController;
AnimationController _animationController;
@override
void initState() {

View File

@ -1,5 +1,3 @@
//@dart=2.10
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
@ -28,7 +26,7 @@ class _MyAppState extends State<MyApp> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ElevatedButton(
RaisedButton(
child: Text('Export all frames'),
onPressed: _export,
),

View File

@ -21,36 +21,32 @@ class App extends StatelessWidget {
appBar: AppBar(
title: Text('Lottie Flutter'),
),
body: Scrollbar(
child: GridView.builder(
itemCount: files.length,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
itemBuilder: (context, index) {
var assetName = files[index];
return GestureDetector(
child: _Item(
child: Lottie.asset(
assetName,
frameBuilder: (context, child, composition) {
return AnimatedOpacity(
child: child,
opacity: composition == null ? 0 : 1,
duration: const Duration(seconds: 1),
curve: Curves.easeOut,
);
},
),
body: GridView.builder(
itemCount: files.length,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
itemBuilder: (context, index) {
var assetName = files[index];
return GestureDetector(
child: _Item(
child: Lottie.asset(
assetName,
frameBuilder: (context, child, composition) {
return AnimatedOpacity(
child: child,
opacity: composition == null ? 0 : 1,
duration: const Duration(seconds: 1),
curve: Curves.easeOut,
);
},
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (context) => Detail(assetName)));
},
);
},
),
),
onTap: () {
Navigator.of(context).push(MaterialPageRoute<void>(
builder: (context) => Detail(assetName)));
},
);
},
),
),
);
@ -60,7 +56,7 @@ class App extends StatelessWidget {
class _Item extends StatelessWidget {
final Widget child;
const _Item({Key? key, required this.child}) : super(key: key);
const _Item({Key key, this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -85,18 +81,26 @@ class _Item extends StatelessWidget {
class Detail extends StatefulWidget {
final String assetName;
const Detail(this.assetName, {Key? key}) : super(key: key);
const Detail(this.assetName, {Key key}) : super(key: key);
@override
_DetailState createState() => _DetailState();
}
class _DetailState extends State<Detail> with TickerProviderStateMixin {
late final _controller = AnimationController(vsync: this);
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}

View File

@ -13,7 +13,7 @@ void main() async {
class App extends StatelessWidget {
final LottieComposition composition;
const App({Key? key, required this.composition}) : super(key: key);
const App({Key key, this.composition}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -97,13 +97,13 @@ class App extends StatelessWidget {
class _Lottie extends StatefulWidget {
final LottieComposition composition;
final double? width;
final double? height;
final BoxFit? fit;
final AlignmentGeometry? alignment;
final double width;
final double height;
final BoxFit fit;
final AlignmentGeometry alignment;
const _Lottie(this.composition,
{Key? key, this.width, this.height, this.fit, this.alignment})
{Key key, this.width, this.height, this.fit, this.alignment})
: super(key: key);
@override
@ -111,7 +111,7 @@ class _Lottie extends StatefulWidget {
}
class __LottieState extends State<_Lottie> with TickerProviderStateMixin {
late AnimationController _controller;
AnimationController _controller;
@override
void initState() {

View File

@ -6,7 +6,7 @@ void main() async {
}
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -6,7 +6,7 @@ void main() async {
}
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
const App({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -1,3 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"

View File

@ -1,3 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"

View File

@ -1,28 +1,27 @@
PODS:
- FlutterMacOS (1.22.4)
- FlutterMacOS (1.0.0)
- path_provider (0.0.1)
- path_provider_macos (0.0.1):
- FlutterMacOS
DEPENDENCIES:
- FlutterMacOS (from `Flutter/ephemeral/.symlinks/flutter/darwin-x64-profile`)
- path_provider (from `Flutter/ephemeral/.symlinks/plugins/path_provider/macos`)
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
SPEC REPOS:
trunk:
- FlutterMacOS
EXTERNAL SOURCES:
FlutterMacOS:
:path: Flutter/ephemeral/.symlinks/flutter/darwin-x64-profile
path_provider:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider/macos
path_provider_macos:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
SPEC CHECKSUMS:
FlutterMacOS: ac210ef71944b3f04789076d70d4c72c7ec0c619
FlutterMacOS: 15bea8a44d2fa024068daa0140371c020b4b6ff9
path_provider: e0848572d1d38b9a7dd099e79cf83f5b7e2cde9f
path_provider_macos: a0a3fd666cb7cd0448e936fb4abad4052961002b
PODFILE CHECKSUM: d8ba9b3e9e93c62c74a660b46c6fcb09f03991a7
COCOAPODS: 1.10.1
COCOAPODS: 1.9.1

View File

@ -26,6 +26,10 @@
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; };
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
F03CC91740A974D36C2A6384 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BC6FF5FCD90624533CC60DB /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
@ -46,6 +50,8 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */,
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */,
);
name = "Bundle Framework";
runOnlyForDeploymentPostprocessing = 0;
@ -67,12 +73,14 @@
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; };
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
5B4C0E87024EC2686CA05E23 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -80,6 +88,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
F03CC91740A974D36C2A6384 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -135,6 +145,8 @@
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
D73912EF22F37F9E000D13A0 /* App.framework */,
33D1A10322148B71006C7A3E /* FlutterMacOS.framework */,
);
path = Flutter;
sourceTree = "<group>";
@ -269,7 +281,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\n";
};
33CC111E2044C6BF0003C045 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
@ -318,10 +330,10 @@
buildActionMask = 2147483647;
files = (
);
inputPaths = (
inputFileListPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
outputFileListPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;

View File

@ -7,70 +7,77 @@ packages:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
version: "2.0.13"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0"
version: "2.4.2"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.0.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.0.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.1.3"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.0.1"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
version: "1.14.13"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
version: "2.1.5"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.3"
version: "1.1.0"
file:
dependency: transitive
description:
@ -89,7 +96,7 @@ packages:
name: flutter_colorpicker
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0-nullsafety.0"
version: "0.3.4"
flutter_test:
dependency: "direct dev"
description: flutter
@ -101,7 +108,7 @@ packages:
name: golden_toolkit
url: "https://pub.dartlang.org"
source: hosted
version: "0.9.0-nullsafety.0"
version: "0.6.0"
http:
dependency: "direct main"
description:
@ -129,42 +136,42 @@ packages:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "0.11.4"
lottie:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "1.0.0"
version: "0.6.0"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
version: "0.12.8"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
version: "1.1.8"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
version: "1.7.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.27"
version: "1.6.14"
path_provider_linux:
dependency: transitive
description:
@ -178,28 +185,21 @@ packages:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4+8"
version: "0.0.4+3"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4+3"
version: "1.0.3"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.2"
version: "1.9.0"
platform:
dependency: transitive
description:
@ -213,7 +213,7 @@ packages:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
version: "1.0.2"
process:
dependency: transitive
description:
@ -232,70 +232,63 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
version: "1.7.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
version: "1.9.5"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.0.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.0.5"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.1.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19"
version: "0.2.17"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
version: "1.2.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.4"
version: "2.0.8"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
version: "0.1.0"
sdks:
dart: ">=2.12.0-29.10.beta <3.0.0"
flutter: ">=1.24.0-10.2.pre"
dart: ">=2.9.0-14.0.dev <3.0.0"
flutter: ">=1.12.13+hotfix.5 <2.0.0"

View File

@ -1,23 +1,23 @@
name: lottie_example
description: A sample app for the Lottie player
publish_to: none
version: 0.0.1
environment:
sdk: ">=2.12.0-0 <3.0.0"
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
flutter_colorpicker: ^0.4.0-nullsafety.0
http:
lottie:
path: ../
flutter_colorpicker:
path_provider:
http:
dev_dependencies:
flutter_test:
sdk: flutter
golden_toolkit: ^0.9.0-nullsafety.0
golden_toolkit:
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
@ -31,7 +31,6 @@ flutter:
- assets/lottiefiles/
- assets/Mobilo/
- assets/Tests/
- assets/Tests/images/
- assets/Logo/
- assets/Images/
- assets/Images/WeAccept/

View File

@ -1,74 +0,0 @@
import 'dart:async';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:lottie/lottie.dart';
import 'utils.dart';
void main() {
testWidgets('Can specify ImageProvider with zip file ', (tester) async {
var size = Size(500, 400);
tester.binding.window.physicalSizeTestValue = size;
tester.binding.window.devicePixelRatioTestValue = 1.0;
var callCount = 0;
LottieImageProviderFactory imageProviderFactory = (image) {
++callCount;
return FileImage(File('assets/Images/WeAccept/img_0.png'));
};
var composition = (await tester.runAsync(() => FileLottie(
File('assets/spinning_carrousel.zip'),
imageProviderFactory: imageProviderFactory)
.load()))!;
await tester.pumpWidget(FilmStrip(composition, size: size));
expect(callCount, 2);
await expectLater(find.byType(FilmStrip),
matchesGoldenFile('goldens/dynamic_image/zip_with_provider.png'));
});
testWidgets('Can specify image delegate', (tester) async {
var size = Size(500, 400);
tester.binding.window.physicalSizeTestValue = size;
tester.binding.window.devicePixelRatioTestValue = 1.0;
var image = await tester.runAsync(
() => loadImage(FileImage(File('assets/Images/WeAccept/img_0.png'))));
var composition = (await tester.runAsync(
() => FileLottie(File('assets/spinning_carrousel.zip')).load()))!;
var delegates = LottieDelegates(image: (composition, asset) {
return image;
});
await tester.pumpWidget(FilmStrip(
composition,
size: size,
delegates: delegates,
));
await expectLater(find.byType(FilmStrip),
matchesGoldenFile('goldens/dynamic_image/delegate.png'));
});
}
Future<ui.Image?> loadImage(ImageProvider provider) {
var completer = Completer<ui.Image?>();
var imageStream = provider.resolve(ImageConfiguration.empty);
late ImageStreamListener listener;
listener = ImageStreamListener((image, synchronousLoaded) {
imageStream.removeListener(listener);
completer.complete(image.image);
}, onError: (dynamic e, __) {
imageStream.removeListener(listener);
completer.complete();
});
imageStream.addListener(listener);
return completer.future;
}

View File

@ -7,7 +7,7 @@ import 'package:lottie/lottie.dart';
import 'utils.dart';
void main() {
late LottieComposition composition;
LottieComposition composition;
setUpAll(() async {
composition = await LottieComposition.fromBytes(
@ -15,7 +15,7 @@ void main() {
});
void testGolden(String description, ValueDelegate delegate,
{double? progress}) async {
{double progress}) async {
var screenshotName = description
.toLowerCase()
.replaceAll(RegExp('[^a-z0-9 ]'), '')
@ -288,8 +288,8 @@ void main() {
testGolden(
'Opacity interpolation ($progress)',
ValueDelegate.transformOpacity(['Shape Layer 1', 'Rectangle'],
callback: (frameInfo) => lerpDouble(10, 100,
Curves.linear.transform(frameInfo.overallProgress))!
callback: (frameInfo) => lerpDouble(
10, 100, Curves.linear.transform(frameInfo.overallProgress))
.round()),
progress: progress);
}

View File

@ -1,7 +1,7 @@
import 'dart:async';
import 'package:golden_toolkit/golden_toolkit.dart';
Future<void> testExecutable(FutureOr<void> Function() testMain) async {
Future<void> main(FutureOr<void> Function() testMain) async {
await loadAppFonts();
return testMain();
}

View File

@ -16,8 +16,7 @@ void main() {
var size = Size(500, 400);
tester.binding.window.physicalSizeTestValue = size;
tester.binding.window.devicePixelRatioTestValue = 1.0;
var composition =
(await tester.runAsync(() => FileLottie(asset).load()))!;
var composition = await tester.runAsync(() => FileLottie(asset).load());
await tester.pumpWidget(FilmStrip(composition, size: size));

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 884 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

View File

@ -3,11 +3,11 @@ import 'package:lottie/lottie.dart';
class FilmStrip extends StatelessWidget {
final LottieComposition composition;
final LottieDelegates? delegates;
final LottieDelegates delegates;
final Size size;
const FilmStrip(this.composition,
{Key? key, required this.size, this.delegates})
{Key key, @required this.size, this.delegates})
: super(key: key);
@override

View File

@ -9,7 +9,6 @@ export 'src/model/marker.dart' show Marker;
export 'src/options.dart' show LottieOptions;
export 'src/providers/asset_provider.dart' show AssetLottie;
export 'src/providers/file_provider.dart' show FileLottie;
export 'src/providers/load_image.dart' show LottieImageProviderFactory;
export 'src/providers/lottie_provider.dart' show LottieProvider;
export 'src/providers/memory_provider.dart' show MemoryLottie;
export 'src/providers/network_provider.dart' show NetworkLottie;

View File

@ -34,20 +34,21 @@ abstract class BaseStrokeContent
final List<double> _dashPatternValues;
final Paint paint = Paint()..style = PaintingStyle.stroke;
final BaseKeyframeAnimation<Object, double> _widthAnimation;
final BaseKeyframeAnimation<Object, int> _opacityAnimation;
final List<BaseKeyframeAnimation<Object, double>> _dashPatternAnimations;
final BaseKeyframeAnimation<Object, double>? _dashPatternOffsetAnimation;
BaseKeyframeAnimation<ColorFilter, ColorFilter?>? _colorFilterAnimation;
final BaseKeyframeAnimation<dynamic, double> _widthAnimation;
final BaseKeyframeAnimation<dynamic, int> _opacityAnimation;
final List<BaseKeyframeAnimation<dynamic, double>> _dashPatternAnimations;
final BaseKeyframeAnimation<dynamic,
double> /*?*/ _dashPatternOffsetAnimation;
BaseKeyframeAnimation<ColorFilter, ColorFilter> /*?*/ _colorFilterAnimation;
BaseStrokeContent(this.lottieDrawable, this.layer,
{required StrokeCap cap,
required StrokeJoin join,
required double miterLimit,
required AnimatableIntegerValue opacity,
required AnimatableDoubleValue width,
required List<AnimatableDoubleValue> dashPattern,
AnimatableDoubleValue? dashOffset})
{StrokeCap cap,
StrokeJoin join,
double miterLimit,
AnimatableIntegerValue opacity,
AnimatableDoubleValue width,
List<AnimatableDoubleValue> dashPattern,
AnimatableDoubleValue dashOffset})
: _widthAnimation = width.createAnimation(),
_opacityAnimation = opacity.createAnimation(),
_dashPatternOffsetAnimation = dashOffset?.createAnimation(),
@ -75,7 +76,7 @@ abstract class BaseStrokeContent
_dashPatternAnimations[i].addUpdateListener(onUpdateListener);
}
if (_dashPatternOffsetAnimation != null) {
_dashPatternOffsetAnimation!.addUpdateListener(onUpdateListener);
_dashPatternOffsetAnimation.addUpdateListener(onUpdateListener);
}
}
@ -85,7 +86,7 @@ abstract class BaseStrokeContent
@override
void setContents(List<Content> contentsBefore, List<Content> contentsAfter) {
TrimPathContent? trimPathContentBefore;
TrimPathContent trimPathContentBefore;
for (var i = contentsBefore.length - 1; i >= 0; i--) {
var content = contentsBefore[i];
if (content is TrimPathContent &&
@ -97,7 +98,7 @@ abstract class BaseStrokeContent
trimPathContentBefore.addListener(onUpdateListener);
}
_PathGroup? currentPathGroup;
_PathGroup currentPathGroup;
for (var i = contentsAfter.length - 1; i >= 0; i--) {
var content = contentsAfter[i];
if (content is TrimPathContent &&
@ -118,8 +119,7 @@ abstract class BaseStrokeContent
}
@override
void draw(Canvas canvas, Size size, Matrix4 parentMatrix,
{required int parentAlpha}) {
void draw(Canvas canvas, Size size, Matrix4 parentMatrix, {int parentAlpha}) {
L.beginSection('StrokeContent#draw');
if (parentMatrix.hasZeroScaleAxis) {
L.endSection('StrokeContent#draw');
@ -136,7 +136,7 @@ abstract class BaseStrokeContent
}
if (_colorFilterAnimation != null) {
paint.colorFilter = _colorFilterAnimation!.value;
paint.colorFilter = _colorFilterAnimation.value;
}
for (var i = 0; i < _pathGroups.length; i++) {
@ -175,17 +175,18 @@ abstract class BaseStrokeContent
var pathMetrics = _path.computeMetrics().toList();
var totalLength = pathMetrics.fold<double>(0.0, (a, b) => a + b.length);
var trimPath = pathGroup.trimPath!;
var offsetLength = totalLength * trimPath.offset.value / 360.0;
var startLength = totalLength * trimPath.start.value / 100.0 + offsetLength;
var endLength = totalLength * trimPath.end.value / 100.0 + offsetLength;
var offsetLength = totalLength * pathGroup.trimPath.offset.value / 360.0;
var startLength =
totalLength * pathGroup.trimPath.start.value / 100.0 + offsetLength;
var endLength =
totalLength * pathGroup.trimPath.end.value / 100.0 + offsetLength;
var currentLength = 0.0;
for (var j = pathGroup.paths.length - 1; j >= 0; j--) {
_trimPathPath
.set(pathGroup.paths[j].getPath().transform(parentMatrix.storage));
var pathMetrics = _trimPathPath.computeMetrics().toList();
var length = pathMetrics.isNotEmpty ? pathMetrics.first.length : 0;
var length = pathMetrics.first.length;
if (endLength > totalLength &&
endLength - totalLength < currentLength + length &&
currentLength < endLength - totalLength) {
@ -228,7 +229,7 @@ abstract class BaseStrokeContent
}
@override
Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) {
Rect getBounds(Matrix4 parentMatrix, {bool applyParents}) {
L.beginSection('StrokeContent#getBounds');
_path.reset();
for (var i = 0; i < _pathGroups.length; i++) {
@ -241,9 +242,11 @@ abstract class BaseStrokeContent
var bounds = _path.getBounds();
var width = _widthAnimation.value;
bounds = bounds.inflate(width / 2.0);
bounds = Rect.fromLTWH(bounds.left - width / 2.0, bounds.top - width / 2.0,
bounds.right + width / 2.0, bounds.bottom + width / 2.0);
// Add padding to account for rounding errors.
bounds = bounds.inflate(1);
bounds = Rect.fromLTWH(
bounds.left - 1, bounds.top - 1, bounds.right + 1, bounds.bottom + 1);
L.endSection('StrokeContent#getBounds');
return bounds;
}
@ -276,7 +279,7 @@ abstract class BaseStrokeContent
var offset = _dashPatternOffsetAnimation == null
? 0.0
: _dashPatternOffsetAnimation!.value * scale;
: _dashPatternOffsetAnimation.value * scale;
var newPath = dashPath(path, intervals: _dashPatternValues, phase: offset);
L.endSection('StrokeContent#applyDashPattern');
@ -292,7 +295,7 @@ abstract class BaseStrokeContent
@override
@mustCallSuper
void addValueCallback<T>(T property, LottieValueCallback<T>? callback) {
void addValueCallback<T>(T property, LottieValueCallback<T> /*?*/ callback) {
if (property == LottieProperty.opacity) {
_opacityAnimation.setValueCallback(callback as LottieValueCallback<int>);
} else if (property == LottieProperty.strokeWidth) {
@ -306,9 +309,9 @@ abstract class BaseStrokeContent
_colorFilterAnimation = null;
} else {
_colorFilterAnimation =
ValueCallbackKeyframeAnimation<ColorFilter, ColorFilter?>(
callback as LottieValueCallback<ColorFilter>, null);
_colorFilterAnimation!.addUpdateListener(onUpdateListener);
ValueCallbackKeyframeAnimation<ColorFilter, ColorFilter>(
callback as LottieValueCallback<ColorFilter>);
_colorFilterAnimation.addUpdateListener(onUpdateListener);
layer.addAnimation(_colorFilterAnimation);
}
}
@ -318,7 +321,7 @@ abstract class BaseStrokeContent
/// Data class to help drawing trim paths individually.
class _PathGroup {
final List<PathContent> paths = <PathContent>[];
final TrimPathContent? trimPath;
final TrimPathContent /*?*/ trimPath;
_PathGroup(this.trimPath);
}

View File

@ -1,5 +1,5 @@
abstract class Content {
String? get name;
String get name;
void setContents(List<Content> contentsBefore, List<Content> contentsAfter);
}

View File

@ -1,4 +1,5 @@
import 'dart:ui';
import 'package:meta/meta.dart';
import 'package:vector_math/vector_math_64.dart';
import '../../lottie_drawable.dart';
import '../../model/animatable/animatable_transform.dart';
@ -31,7 +32,8 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
return contents;
}
static AnimatableTransform? findTransform(List<ContentModel> contentModels) {
static AnimatableTransform /*?*/ findTransform(
List<ContentModel> contentModels) {
for (var i = 0; i < contentModels.length; i++) {
var contentModel = contentModels[i];
if (contentModel is AnimatableTransform) {
@ -45,12 +47,12 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
final Path _path = PathFactory.create();
@override
final String? name;
final String name;
final bool _hidden;
final List<Content> _contents;
final LottieDrawable _lottieDrawable;
List<PathContent>? _pathContents;
TransformKeyframeAnimation? _transformAnimation;
List<PathContent> /*?*/ _pathContents;
TransformKeyframeAnimation /*?*/ _transformAnimation;
ContentGroup(final LottieDrawable lottieDrawable, BaseLayer layer,
ShapeGroup shapeGroup)
@ -63,11 +65,11 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
findTransform(shapeGroup.items));
ContentGroup.copy(this._lottieDrawable, BaseLayer layer, this.name,
this._hidden, this._contents, AnimatableTransform? transform) {
this._hidden, this._contents, AnimatableTransform /*?*/ transform) {
if (transform != null) {
_transformAnimation = transform.createAnimation()
..addAnimationsToLayer(layer)
..addListener(onValueChanged);
_transformAnimation = transform.createAnimation();
_transformAnimation.addAnimationsToLayer(layer);
_transformAnimation.addListener(onValueChanged);
}
var greedyContents = <GreedyContent>[];
@ -102,20 +104,20 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
List<PathContent> getPathList() {
if (_pathContents == null) {
var pathContents = _pathContents = <PathContent>[];
_pathContents = <PathContent>[];
for (var i = 0; i < _contents.length; i++) {
var content = _contents[i];
if (content is PathContent) {
pathContents.add(content);
_pathContents.add(content);
}
}
}
return _pathContents!;
return _pathContents;
}
Matrix4 getTransformationMatrix() {
if (_transformAnimation != null) {
return _transformAnimation!.getMatrix();
return _transformAnimation.getMatrix();
}
_matrix.reset();
return _matrix;
@ -126,7 +128,7 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
// TODO: cache this somehow.
_matrix.reset();
if (_transformAnimation != null) {
_matrix.set(_transformAnimation!.getMatrix());
_matrix.set(_transformAnimation.getMatrix());
}
_path.reset();
if (_hidden) {
@ -143,17 +145,17 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
@override
void draw(Canvas canvas, Size size, Matrix4 parentMatrix,
{required int parentAlpha}) {
{@required int parentAlpha}) {
if (_hidden) {
return;
}
_matrix.set(parentMatrix);
int layerAlpha;
if (_transformAnimation != null) {
_matrix.preConcat(_transformAnimation!.getMatrix());
var opacity = _transformAnimation?.opacity == null
_matrix.preConcat(_transformAnimation.getMatrix());
var opacity = _transformAnimation.opacity == null
? 100
: _transformAnimation!.opacity!.value;
: _transformAnimation.opacity.value;
layerAlpha = ((opacity / 100.0 * parentAlpha / 255.0) * 255).round();
} else {
layerAlpha = parentAlpha;
@ -197,10 +199,10 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
}
@override
Rect getBounds(Matrix4 parentMatrix, {required bool applyParents}) {
Rect getBounds(Matrix4 parentMatrix, {bool applyParents}) {
_matrix.set(parentMatrix);
if (_transformAnimation != null) {
_matrix.preConcat(_transformAnimation!.getMatrix());
_matrix.preConcat(_transformAnimation.getMatrix());
}
var bounds = Rect.zero;
for (var i = _contents.length - 1; i >= 0; i--) {
@ -221,8 +223,8 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
return;
}
if ('__container' != name && name != null) {
currentPartialKeyPath = currentPartialKeyPath.addKey(name!);
if ('__container' != name) {
currentPartialKeyPath = currentPartialKeyPath.addKey(name);
if (keyPath.fullyResolvesTo(name, depth)) {
accumulator.add(currentPartialKeyPath.resolve(this));
@ -243,9 +245,9 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
}
@override
void addValueCallback<T>(T property, LottieValueCallback<T>? callback) {
void addValueCallback<T>(T property, LottieValueCallback<T> /*?*/ callback) {
if (_transformAnimation != null) {
_transformAnimation!.applyValueCallback(property, callback);
_transformAnimation.applyValueCallback(property, callback);
}
}
}

View File

@ -1,9 +1,10 @@
import 'dart:ui';
import 'package:meta/meta.dart';
import 'package:vector_math/vector_math_64.dart';
import 'content.dart';
abstract class DrawingContent extends Content {
void draw(Canvas canvas, Size canvasSize, Matrix4 parentMatrix,
{required int parentAlpha});
Rect getBounds(Matrix4 parentMatrix, {required bool applyParents});
{@required int parentAlpha});
Rect getBounds(Matrix4 parentMatrix, {@required bool applyParents});
}

View File

@ -22,10 +22,10 @@ class EllipseContent implements PathContent, KeyPathElementContent {
final Path _path = PathFactory.create();
@override
final String? name;
final String name;
final LottieDrawable lottieDrawable;
final BaseKeyframeAnimation<Object, Offset> _sizeAnimation;
final BaseKeyframeAnimation<Object, Offset> _positionAnimation;
final BaseKeyframeAnimation<dynamic, Offset> _sizeAnimation;
final BaseKeyframeAnimation<dynamic, Offset> _positionAnimation;
final CircleShape _circleShape;
final CompoundTrimPathContent _trimPaths = CompoundTrimPathContent();
@ -115,7 +115,7 @@ class EllipseContent implements PathContent, KeyPathElementContent {
}
@override
void addValueCallback<T>(T property, LottieValueCallback<T>? callback) {
void addValueCallback<T>(T property, LottieValueCallback<T> /*?*/ callback) {
if (property == LottieProperty.ellipseSize) {
_sizeAnimation.setValueCallback(callback as LottieValueCallback<Offset>);
} else if (property == LottieProperty.position) {

Some files were not shown because too many files have changed in this diff Show More