diff --git a/.gitignore b/.gitignore index e43b0f98..4282899b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,61 @@ .DS_Store +pubspec.lock +.idea +*.iml + +# Created by https://www.gitignore.io/api/flutter +# Edit at https://www.gitignore.io/?templates=flutter + +### Flutter ### +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +# End of https://www.gitignore.io/api/flutter diff --git a/example/change_color/lib/main.dart b/example/change_color/lib/main.dart index a35297da..d667bc09 100644 --- a/example/change_color/lib/main.dart +++ b/example/change_color/lib/main.dart @@ -77,7 +77,7 @@ class _MyHomePageState extends State implements FlareController { // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), - body: FlareActor("assets/Change Color Example.flr", // You can find the example project here: https://www.2dimensions.com/a/castor/files/flare/change-color-example + body: FlareActor(FlareAssetAnimationProvider(context: context, fileName: 'Change Color Example.flr'), // You can find the example project here: https://www.2dimensions.com/a/castor/files/flare/change-color-example fit: BoxFit.contain, alignment: Alignment.center, controller: this), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, diff --git a/example/favorite/lib/buttons_row.dart b/example/favorite/lib/buttons_row.dart index 3f0c47b5..a65dc796 100644 --- a/example/favorite/lib/buttons_row.dart +++ b/example/favorite/lib/buttons_row.dart @@ -1,3 +1,4 @@ +import 'package:flare_flutter/flare_providers.dart'; import 'package:flutter/material.dart'; import 'package:flare_flutter/flare_actor.dart'; @@ -8,6 +9,7 @@ class ButtonsRow extends StatefulWidget { class _ButtonsState extends State { static final double containerSize = 20.0; + // Wheather this element is a favorite or not. bool _isFav = false; @@ -44,7 +46,9 @@ class _ButtonsState extends State { margin: EdgeInsets.only(right: 10), width: containerSize, height: containerSize, - child: FlareActor("assets/Favorite.flr", + child: FlareActor( + FlareAssetAnimationProvider( + context: context, fileName: 'assets/Favorite.flr'), shouldClip: false, // Play the animation depending on the state. animation: diff --git a/example/favorite/test/widget_test.dart b/example/favorite/test/widget_test.dart index e7b4c82e..9c6fd1eb 100644 --- a/example/favorite/test/widget_test.dart +++ b/example/favorite/test/widget_test.dart @@ -8,12 +8,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:heart_demo/main.dart'; +import 'package:favorite/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + await tester.pumpWidget(Heart()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); diff --git a/example/penguin_dance/lib/main.dart b/example/penguin_dance/lib/main.dart index 7e4368c9..b196f6af 100644 --- a/example/penguin_dance/lib/main.dart +++ b/example/penguin_dance/lib/main.dart @@ -57,9 +57,11 @@ class _MyHomePageState extends State implements FlareController { body: new Stack( children: [ Positioned.fill( - child: FlareActor("assets/Penguin.flr", + child: FlareActor( + FlareAssetAnimationProvider( + context: context, fileName: 'Penguin.flr'), alignment: Alignment.center, - isPaused: _isPaused, + isPaused: _isPaused, fit: BoxFit.cover, animation: "walk", controller: this)), diff --git a/example/simple/lib/main.dart b/example/simple/lib/main.dart index 1dc14e71..25c787fa 100644 --- a/example/simple/lib/main.dart +++ b/example/simple/lib/main.dart @@ -1,4 +1,5 @@ import "package:flare_flutter/flare_actor.dart"; +import 'package:flare_flutter/flare_providers.dart'; import "package:flutter/material.dart"; void main() => runApp(MyApp()); @@ -38,7 +39,8 @@ class _MyHomePageState extends State { children: [ Expanded( child: FlareActor( - "assets/Filip.flr", + FlareAssetAnimationProvider( + context: context, fileName: 'Filip.flr'), alignment: Alignment.center, fit: BoxFit.contain, animation: _animationName, diff --git a/example/simple/pubspec.lock b/example/simple/pubspec.lock index 8c57407b..18b26757 100644 --- a/example/simple/pubspec.lock +++ b/example/simple/pubspec.lock @@ -29,6 +29,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.14.11" + 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: "2.0.6" cupertino_icons: dependency: "direct main" description: @@ -42,24 +56,45 @@ packages: path: "../../flare_dart" relative: true source: path - version: "1.1.0" + version: "1.3.0" flare_flutter: dependency: "direct main" description: path: "../../flare_flutter" relative: true source: path - version: "1.1.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0+1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" matcher: dependency: transitive description: @@ -81,6 +116,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.2" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0+1" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" quiver: dependency: transitive description: @@ -99,7 +148,14 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "1.5.4" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" stack_trace: dependency: transitive description: @@ -121,20 +177,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.2.2" typed_data: dependency: transitive description: @@ -142,6 +205,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" vector_math: dependency: transitive description: @@ -150,4 +220,5 @@ packages: source: hosted version: "2.0.8" sdks: - dart: ">=2.0.0 <3.0.0" + dart: ">=2.1.0 <3.0.0" + flutter: ">=0.1.4 <2.0.0" diff --git a/example/slider/lib/page.dart b/example/slider/lib/page.dart index 3e95a125..88f1127e 100644 --- a/example/slider/lib/page.dart +++ b/example/slider/lib/page.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:ui'; +import 'package:flare_flutter/flare_providers.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flare_flutter/flare_actor.dart'; @@ -50,7 +51,7 @@ class _PageState extends State with SingleTickerProviderStateMixin { child: Listener( onPointerUp: _scheduleDemo, child: Stack(fit: StackFit.expand, children: [ - FlareActor("assets/Resizing_House.flr", + FlareActor(FlareAssetAnimationProvider(context:context,fileName:"Resizing_House.flr"), controller: _houseController, fit: BoxFit.cover, ), diff --git a/example/slider/pubspec.lock b/example/slider/pubspec.lock index 51a53c3b..e238af0c 100644 --- a/example/slider/pubspec.lock +++ b/example/slider/pubspec.lock @@ -29,6 +29,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.14.11" + 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: "2.0.6" cupertino_icons: dependency: "direct main" description: @@ -42,24 +56,45 @@ packages: path: "../../flare_dart" relative: true source: path - version: "1.1.0" + version: "1.3.0" flare_flutter: dependency: "direct main" description: path: "../../flare_flutter" relative: true source: path - version: "1.1.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0+1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" matcher: dependency: transitive description: @@ -81,6 +116,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.2" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0+1" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" quiver: dependency: transitive description: @@ -99,7 +148,14 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "1.5.4" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" stack_trace: dependency: transitive description: @@ -121,20 +177,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.2.2" typed_data: dependency: transitive description: @@ -142,6 +205,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" vector_math: dependency: transitive description: @@ -151,3 +221,4 @@ packages: version: "2.0.8" sdks: dart: ">=2.1.0 <3.0.0" + flutter: ">=0.1.4 <2.0.0" diff --git a/example/space_reload/lib/refresh_control.dart b/example/space_reload/lib/refresh_control.dart index 0616f55e..c96d8ada 100644 --- a/example/space_reload/lib/refresh_control.dart +++ b/example/space_reload/lib/refresh_control.dart @@ -98,7 +98,9 @@ class _CupertinoRefreshControlDemoState _refreshTriggerPullDistance = refreshTriggerPullDistance; _refreshIndicatorExtent = refreshIndicatorExtent; - return FlareActor("assets/Space Demo.flr", + return FlareActor( + FlareAssetAnimationProvider( + context: context, fileName: 'Space Demo.flr'), alignment: Alignment.center, animation: "idle", fit: BoxFit.cover, diff --git a/example/teddy/lib/main.dart b/example/teddy/lib/main.dart index ca930866..6918bd87 100644 --- a/example/teddy/lib/main.dart +++ b/example/teddy/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:flare_flutter/flare_providers.dart'; import 'package:flutter/material.dart'; import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/rendering.dart'; @@ -31,6 +32,7 @@ class MyHomePage extends StatefulWidget { class _MyHomePageState extends State { TeddyController _teddyController; + @override initState() { _teddyController = TeddyController(); @@ -73,9 +75,11 @@ class _MyHomePageState extends State { children: [ Container( height: 200, - padding: const EdgeInsets.only(left: 30.0, right:30.0), + padding: + const EdgeInsets.only(left: 30.0, right: 30.0), child: FlareActor( - "assets/Teddy.flr", + FlareAssetAnimationProvider( + context: context, fileName: 'Teddy.flr'), shouldClip: false, alignment: Alignment.bottomCenter, fit: BoxFit.contain, diff --git a/flare_dart/.packages b/flare_dart/.packages index e65091e5..a066be96 100644 --- a/flare_dart/.packages +++ b/flare_dart/.packages @@ -1,2 +1,2 @@ -# Generated by pub on 2019-01-17 15:20:42.022759. +# Generated by pub on 2019-03-06 10:50:41.684518. flare_dart:lib/ diff --git a/flare_dart/lib/actor.dart b/flare_dart/lib/actor.dart index 482cc39b..c22b7c47 100644 --- a/flare_dart/lib/actor.dart +++ b/flare_dart/lib/actor.dart @@ -14,6 +14,12 @@ import "stream_reader.dart"; import "block_types.dart"; import "actor_artboard.dart"; +abstract class FlareAnimationProvider { + Future loadAnimation(); + + Future readOutOfBandAsset(String fileName); +} + abstract class Actor { int maxTextureIndex = 0; int _version = 0; @@ -99,7 +105,7 @@ abstract class Actor { Future loadAtlases(List rawAtlases); - Future load(ByteData data, dynamic context) async { + Future load(ByteData data, FlareAnimationProvider provider) async { if (data.lengthInBytes < 5) { throw UnsupportedError("Not a valid Flare file."); } @@ -134,7 +140,7 @@ abstract class Actor { break; case BlockTypes.Atlases: - List rawAtlases = await readAtlasesBlock(block, context); + List rawAtlases = await readAtlasesBlock(block, provider); success = await loadAtlases(rawAtlases); break; } @@ -166,10 +172,10 @@ abstract class Actor { } } - Future readOutOfBandAsset(String filename, dynamic context); + Future readOutOfBandAsset(String fileName, FlareAnimationProvider provider); Future> readAtlasesBlock( - StreamReader block, dynamic context) { + StreamReader block, FlareAnimationProvider provider) { // Determine whether or not the atlas is in or out of band. bool isOOB = block.readBool("isOOB"); block.openArray("data"); @@ -177,7 +183,7 @@ abstract class Actor { if (isOOB) { List> waitingFor = List>(numAtlases); for (int i = 0; i < numAtlases; i++) { - waitingFor[i] = readOutOfBandAsset(block.readString("data"), context); + waitingFor[i] = readOutOfBandAsset(block.readString("data"),provider); } return Future.wait(waitingFor); } else { diff --git a/flare_dart/pubspec.lock b/flare_dart/pubspec.lock index 20aee913..503d8c0d 100644 --- a/flare_dart/pubspec.lock +++ b/flare_dart/pubspec.lock @@ -2,4 +2,4 @@ # See https://www.dartlang.org/tools/pub/glossary#lockfile packages: {} sdks: - dart: ">=2.0.0-dev.58.0 <3.0.0" + dart: ">=2.1.0 <3.0.0" diff --git a/flare_dart/pubspec.yaml b/flare_dart/pubspec.yaml index 1724dc32..5abdb3ea 100644 --- a/flare_dart/pubspec.yaml +++ b/flare_dart/pubspec.yaml @@ -1,6 +1,6 @@ name: flare_dart description: Vector design and runtime animation. -version: 1.3.0 +version: 2.0.0 author: "2Dimensions Team " homepage: https://github.com/2d-inc/Flare-Flutter environment: diff --git a/flare_flutter/.packages b/flare_flutter/.packages deleted file mode 100644 index 9efee100..00000000 --- a/flare_flutter/.packages +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by pub on 2019-01-17 15:31:42.766999. -async:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/async-2.0.8/lib/ -boolean_selector:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.4/lib/ -charcode:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ -collection:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ -flare_dart:../flare_dart/lib/ -flutter:file:///Users/luigirosso/Projects/flutter/packages/flutter/lib/ -flutter_test:file:///Users/luigirosso/Projects/flutter/packages/flutter_test/lib/ -matcher:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.3+1/lib/ -meta:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/meta-1.1.6/lib/ -path:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/path-1.6.2/lib/ -quiver:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.1/lib/ -sky_engine:file:///Users/luigirosso/Projects/flutter/bin/cache/pkg/sky_engine/lib/ -source_span:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.1/lib/ -stack_trace:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ -stream_channel:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.8/lib/ -string_scanner:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.4/lib/ -term_glyph:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.1/lib/ -test_api:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.1/lib/ -typed_data:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ -vector_math:file:///Users/luigirosso/.pub-cache/hosted/pub.dartlang.org/vector_math-2.0.8/lib/ -flare_flutter:lib/ diff --git a/flare_flutter/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/flare_flutter/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java index d007606a..4ac56ff5 100644 --- a/flare_flutter/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ b/flare_flutter/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -1,6 +1,8 @@ package io.flutter.plugins; import io.flutter.plugin.common.PluginRegistry; +import io.flutter.plugins.pathprovider.PathProviderPlugin; +import com.tekartik.sqflite.SqflitePlugin; /** * Generated file. Do not edit. @@ -10,6 +12,8 @@ public static void registerWith(PluginRegistry registry) { if (alreadyRegisteredWith(registry)) { return; } + PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin")); + SqflitePlugin.registerWith(registry.registrarFor("com.tekartik.sqflite.SqflitePlugin")); } private static boolean alreadyRegisteredWith(PluginRegistry registry) { diff --git a/flare_flutter/android/local.properties b/flare_flutter/android/local.properties deleted file mode 100644 index 5cc61eae..00000000 --- a/flare_flutter/android/local.properties +++ /dev/null @@ -1,2 +0,0 @@ -sdk.dir=/usr/local/share/android-sdk -flutter.sdk=/Users/luigirosso/Projects/flutter \ No newline at end of file diff --git a/flare_flutter/ios/Runner/GeneratedPluginRegistrant.m b/flare_flutter/ios/Runner/GeneratedPluginRegistrant.m index 60dfa42b..5d47dcd8 100644 --- a/flare_flutter/ios/Runner/GeneratedPluginRegistrant.m +++ b/flare_flutter/ios/Runner/GeneratedPluginRegistrant.m @@ -3,10 +3,14 @@ // #import "GeneratedPluginRegistrant.h" +#import +#import @implementation GeneratedPluginRegistrant + (void)registerWithRegistry:(NSObject*)registry { + [FLTPathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPathProviderPlugin"]]; + [SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]]; } @end diff --git a/flare_flutter/lib/flare.dart b/flare_flutter/lib/flare.dart index 889d3373..82680d9a 100644 --- a/flare_flutter/lib/flare.dart +++ b/flare_flutter/lib/flare.dart @@ -4,6 +4,7 @@ import 'dart:ui' as ui; import 'dart:math'; import 'package:flare_dart/actor_image.dart'; import 'package:flare_dart/math/aabb.dart'; +import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/services.dart'; import 'dart:async'; import 'dart:typed_data'; @@ -27,9 +28,13 @@ import 'package:flare_dart/path_point.dart'; export 'package:flare_dart/animation/actor_animation.dart'; export 'package:flare_dart/actor_node.dart'; import 'trim_path.dart'; +import 'package:http/http.dart' as http; + +export 'package:flare_flutter/flare_providers.dart'; abstract class FlutterActorDrawable { ui.BlendMode _blendMode; + int get blendModeId { return _blendMode.index; } @@ -39,6 +44,7 @@ abstract class FlutterActorDrawable { } ui.BlendMode get blendMode => _blendMode; + set blendMode(ui.BlendMode mode) { if (_blendMode == mode) { return; @@ -54,6 +60,7 @@ abstract class FlutterActorDrawable { abstract class FlutterFill { ui.Paint _paint; + void initializeGraphics() { _paint = ui.Paint()..style = PaintingStyle.fill; } @@ -517,12 +524,6 @@ class FlutterRadialStroke extends RadialGradientStroke with FlutterStroke { } } -class _AssetBundleContext { - String filename; - AssetBundle bundle; - _AssetBundleContext(filename, bundle); -} - class FlutterActor extends Actor { List _images; @@ -590,9 +591,9 @@ class FlutterActor extends Actor { return FlutterRadialStroke(); } - Future loadFromBundle(AssetBundle assetBundle, String filename) async { - ByteData data = await assetBundle.load(filename); - return super.load(data, _AssetBundleContext(assetBundle, filename)); + Future loadFromProvider(FlareAnimationProvider provider) async { + ByteData data = await provider.loadAnimation(); + return super.load(data, provider); } dispose() {} @@ -610,13 +611,8 @@ class FlutterActor extends Actor { @override Future readOutOfBandAsset( - String assetFilename, dynamic context) async { - _AssetBundleContext bundleContext = context; - int pathIdx = bundleContext.filename.lastIndexOf('/') + 1; - String basePath = bundleContext.filename.substring(0, pathIdx); - ByteData data = await bundleContext.bundle.load(basePath + assetFilename); - return Uint8List.view(data.buffer); - } + String fileName, FlareAnimationProvider provider) => + provider.readOutOfBandAsset(fileName); } class FlutterActorArtboard extends ActorArtboard { @@ -701,8 +697,11 @@ abstract class FlutterPath { // they should implement FlutterPath and generate the path another way. abstract class FlutterPathPointsPath implements FlutterPath { ui.Path _path = ui.Path(); + List get deformedPoints; + bool get isClosed; + bool _isValid = false; ui.Path get path { diff --git a/flare_flutter/lib/flare_actor.dart b/flare_flutter/lib/flare_actor.dart index 305085e4..3fc28c19 100644 --- a/flare_flutter/lib/flare_actor.dart +++ b/flare_flutter/lib/flare_actor.dart @@ -1,5 +1,7 @@ +import 'dart:async'; import 'dart:math'; import 'dart:typed_data'; +import 'package:flare_dart/actor.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; @@ -14,7 +16,7 @@ import 'flare_controller.dart'; typedef void FlareCompletedCallback(String name); class FlareActor extends LeafRenderObjectWidget { - final String filename; + final FlareAnimationProvider provider; final String animation; final BoxFit fit; final Alignment alignment; @@ -25,7 +27,7 @@ class FlareActor extends LeafRenderObjectWidget { final Color color; final String boundsNode; - FlareActor(this.filename, + FlareActor(this.provider, {this.boundsNode, this.animation, this.fit = BoxFit.contain, @@ -39,8 +41,7 @@ class FlareActor extends LeafRenderObjectWidget { @override RenderObject createRenderObject(BuildContext context) { return FlareActorRenderObject() - ..assetBundle = DefaultAssetBundle.of(context) - ..filename = filename + ..provider = provider ..fit = fit ..alignment = alignment ..animationName = animation @@ -56,8 +57,7 @@ class FlareActor extends LeafRenderObjectWidget { void updateRenderObject( BuildContext context, covariant FlareActorRenderObject renderObject) { renderObject - ..assetBundle = DefaultAssetBundle.of(context) - ..filename = filename + ..provider = provider ..fit = fit ..alignment = alignment ..animationName = animation @@ -76,17 +76,18 @@ class FlareAnimationLayer { String name; ActorAnimation animation; double time = 0.0, mix = 0.0; + apply(FlutterActorArtboard artboard) { animation.apply(time, artboard, mix); } get duration => animation.duration; + get isDone => time >= animation.duration; } class FlareActorRenderObject extends RenderBox { - AssetBundle assetBundle; - String _filename; + FlareAnimationProvider _provider; BoxFit _fit; Alignment _alignment; String _animationName; @@ -108,6 +109,7 @@ class FlareActorRenderObject extends RenderBox { Color _color; Color get color => _color; + set color(Color value) { if (value != _color) { _color = value; @@ -126,6 +128,7 @@ class FlareActorRenderObject extends RenderBox { } String get boundsNodeName => _boundsNodeName; + set boundsNodeName(String value) { if (_boundsNodeName == value) { return; @@ -159,6 +162,7 @@ class FlareActorRenderObject extends RenderBox { } BoxFit get fit => _fit; + set fit(BoxFit value) { if (value != _fit) { _fit = value; @@ -167,6 +171,7 @@ class FlareActorRenderObject extends RenderBox { } bool get isPlaying => _isPlaying; + set isPlaying(bool value) { if (value != _isPlaying) { _isPlaying = value; @@ -190,6 +195,7 @@ class FlareActorRenderObject extends RenderBox { } String get animationName => _animationName; + set animationName(String value) { if (value != _animationName) { _animationName = value; @@ -198,6 +204,7 @@ class FlareActorRenderObject extends RenderBox { } FlareController get controller => _controller; + set controller(FlareController c) { if (_controller != c) { _controller = c; @@ -207,22 +214,23 @@ class FlareActorRenderObject extends RenderBox { } } - String get filename => _filename; - set filename(String value) { - if (value != _filename) { - _filename = value; + FlareAnimationProvider get provider => _provider; + + set provider(FlareAnimationProvider value) { + if (value != _provider) { + _provider = value; if (_actor != null) { _actor.dispose(); _actor = null; _artboard = null; } - if (_filename == null) { + if (_provider == null) { markNeedsPaint(); return; } FlutterActor actor = FlutterActor(); - actor.loadFromBundle(assetBundle, _filename).then((bool success) { + actor.loadFromProvider(provider).then((bool success) { if (success) { _actor = actor; _artboard = _actor?.artboard; @@ -251,6 +259,7 @@ class FlareActorRenderObject extends RenderBox { } Alignment get alignment => _alignment; + set alignment(Alignment value) { if (value != _alignment) { _alignment = value; @@ -259,6 +268,7 @@ class FlareActorRenderObject extends RenderBox { } FlareCompletedCallback get completed => _completedCallback; + set completed(FlareCompletedCallback value) { if (_completedCallback != value) { _completedCallback = value; @@ -472,3 +482,5 @@ class FlareActorRenderObject extends RenderBox { } } } + + diff --git a/flare_flutter/lib/flare_providers.dart b/flare_flutter/lib/flare_providers.dart new file mode 100644 index 00000000..4a8aeb4d --- /dev/null +++ b/flare_flutter/lib/flare_providers.dart @@ -0,0 +1,120 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:flare_dart/actor.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; + +class FlareAssetAnimationProvider extends FlareAnimationProvider { + FlareAssetAnimationProvider( + {@required this.context, + @required this.fileName, + this.assetPath = 'assets/'}) + : assert(context != null), + assert(fileName != null), + assertBundle = DefaultAssetBundle.of(context); + + final String fileName; + final String assetPath; + final BuildContext context; + final AssetBundle assertBundle; + + @override + Future loadAnimation() { + return assertBundle.load(assetPath + fileName); + } + + @override + Future readOutOfBandAsset(String fileName) async { + int pathIdx = fileName.lastIndexOf('/') + 1; + String basePath = fileName.substring(0, pathIdx); + ByteData data = await assertBundle.load(basePath + fileName); + return Uint8List.view(data.buffer); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FlareAssetAnimationProvider && + runtimeType == other.runtimeType && + fileName == other.fileName && + assetPath == other.assetPath; + + @override + int get hashCode => + fileName.hashCode ^ + assetPath.hashCode; + + + +} + +class FlareNetworkAnimationProvider extends FlareAnimationProvider { + FlareNetworkAnimationProvider({@required this.url}) : assert(url != null); + + final String url; + + @override + Future loadAnimation() async { + final response = await http.get(url); + final buffer = response.bodyBytes.buffer; + return ByteData.view(buffer); + } + + @override + Future readOutOfBandAsset(String fileName) { + throw UnsupportedError('network provider can\'t load band asset'); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FlareNetworkAnimationProvider && + runtimeType == other.runtimeType && + url == other.url; + + @override + int get hashCode => url.hashCode; + + + +} + +class FlareCachedNetworkAnimationProvider extends FlareAnimationProvider { + FlareCachedNetworkAnimationProvider( + {@required this.url, BaseCacheManager cacheManager}) + : assert(url != null), + cacheManager = + cacheManager != null ? cacheManager : DefaultCacheManager(); + + final String url; + final BaseCacheManager cacheManager; + + @override + Future loadAnimation() async { + final file = await cacheManager.getSingleFile(url); + final bytes = Uint8List.fromList(await file.readAsBytes()); + final buffer = bytes.buffer; + return ByteData.view(buffer); + } + + @override + Future readOutOfBandAsset(String fileName) { + throw UnsupportedError('cached network provider can\'t load band asset'); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FlareCachedNetworkAnimationProvider && + runtimeType == other.runtimeType && + url == other.url; + + @override + int get hashCode => url.hashCode; + + + +} diff --git a/flare_flutter/pubspec.lock b/flare_flutter/pubspec.lock deleted file mode 100644 index ad8030c4..00000000 --- a/flare_flutter/pubspec.lock +++ /dev/null @@ -1,139 +0,0 @@ -# Generated by pub -# See https://www.dartlang.org/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.14.11" - flare_dart: - dependency: "direct main" - description: - path: "../flare_dart" - relative: true - source: path - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.3+1" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.2" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.3" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.8" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" -sdks: - dart: ">=2.0.0 <3.0.0" diff --git a/flare_flutter/pubspec.yaml b/flare_flutter/pubspec.yaml index 7ab186dc..55e7fb5c 100644 --- a/flare_flutter/pubspec.yaml +++ b/flare_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: flare_flutter description: Vector design and runtime animation for Flutter. -version: 1.3.0 +version: 2.0.0 author: "2Dimensions Team " homepage: https://github.com/2d-inc/Flare-Flutter environment: @@ -8,9 +8,10 @@ environment: dependencies: flutter: sdk: flutter - flare_dart: ^1.3.0 + flare_dart: ^2.0.0 + flutter_cache_manager: ">=0.3.1 <0.4.0" # flare_dart: - # path: ../flare_dart + # path: ../flare_dart dev_dependencies: flutter_test: sdk: flutter \ No newline at end of file