From f9f9d3241dea0cd39e464e6f7586263064e320f9 Mon Sep 17 00:00:00 2001 From: Jeremiah Ogbomo Date: Sun, 4 Nov 2018 13:18:06 +0100 Subject: [PATCH] release: 3.0 (#45) * chore: first look * chore: second pass * chore: code clean * chore: update README & CHANGELOG * chore: doc clean up --- CHANGELOG.md | 28 ++++++ README.md | 20 +++- analysis_options.yaml | 7 +- .../xcshareddata/WorkspaceSettings.xcsettings | 8 ++ example/lib/main.dart | 8 +- example/lib/showcase.dart | 24 ++--- example/lib/workspace.dart | 14 ++- example/pubspec.lock | 2 +- lib/flutter_spinkit.dart | 2 +- lib/src/chasing_dots.dart | 53 +++++++---- lib/src/circle.dart | 38 +++++--- lib/src/cube_grid.dart | 88 +++++++++++------- lib/src/double_bounce.dart | 51 ++++++---- lib/src/dual_ring.dart | 19 ++-- lib/src/fading_circle.dart | 40 +++++--- lib/src/fading_cube.dart | 35 +++++-- lib/src/fading_four.dart | 51 ++++++---- lib/src/fading_grid.dart | 72 ++++++++------ lib/src/folding_cube.dart | 48 ++++++---- lib/src/hour_glass.dart | 19 ++-- lib/src/pouring_hour_glass.dart | 4 +- lib/src/pulse.dart | 38 +++++--- lib/src/pumping_heart.dart | 44 ++++++--- lib/src/ring.dart | 28 +++--- lib/src/ripple.dart | 63 +++++++------ lib/src/rotating_circle.dart | 48 ++++++---- lib/src/rotating_plain.dart | 46 ++++++--- lib/src/spinning_circle.dart | 45 ++++++--- lib/src/three_bounce.dart | 50 ++++++---- lib/src/wandering_cubes.dart | 77 +++++++++------ lib/src/wave.dart | 82 +++++++++------- pubspec.yaml | 2 +- screenshots/itemBuilder.gif | Bin 0 -> 59364 bytes 33 files changed, 748 insertions(+), 406 deletions(-) create mode 100644 example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 screenshots/itemBuilder.gif diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29..b178573 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,28 @@ +# 3.0.0 + +### Before + +```dart +SpinKitFadingCircle( + color: Colors.white, + size: 50.0, +); +``` + +### Now, there is an itemBuilder alternative + +```dart +SpinKitFadingCircle( + itemBuilder: (_, int index) { + return DecoratedBox( + decoration: BoxDecoration( + color: index.isEven ? Colors.red : Colors.green, + ), + ); + }, +); +``` + +### Which produces + + diff --git a/README.md b/README.md index a2c5b2e..93eee1c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A collection of loading indicators animated with flutter. Heavily inspired by [@ ```yaml dependencies: - flutter_spinkit: "^2.1.0" + flutter_spinkit: "^3.0.0" ``` ### ⚡️ Import @@ -26,6 +26,24 @@ SpinKitRotatingCircle( ); ``` +#### As from 3.0.0 + +```dart +SpinKitFadingCircle( + itemBuilder: (_, int index) { + return DecoratedBox( + decoration: BoxDecoration( + color: index.isEven ? Colors.red : Colors.green, + ), + ); + }, +); +``` + +#### Which produces + + + For more info, please, refer to the `showcase.dart` in the example. ## 🚀 Roadmap diff --git a/analysis_options.yaml b/analysis_options.yaml index f38e330..2569a14 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -34,11 +34,11 @@ analyzer: # allow having TODOs in the code todo: ignore exclude: - - 'bin/cache/**' + - "bin/cache/**" # the following two are relative to the stocks example and the flutter package respectively # see https://github.com/dart-lang/sdk/issues/28463 - - 'lib/i18n/stock_messages_*.dart' - - 'lib/src/http/**' + - "lib/i18n/stock_messages_*.dart" + - "lib/src/http/**" linter: rules: @@ -146,6 +146,7 @@ linter: - unnecessary_brace_in_string_interps - unnecessary_getters_setters # - unnecessary_lambdas # https://github.com/dart-lang/linter/issues/498 + - unnecessary_new - unnecessary_null_aware_assignments - unnecessary_null_in_if_null_operators - unnecessary_overrides diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..949b678 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/example/lib/main.dart b/example/lib/main.dart index bccd6a5..caf2e8d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,18 +3,18 @@ import 'package:flutter/material.dart'; import './showcase.dart'; import './workspace.dart'; -void main() => runApp(new App()); +void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) { - return new MaterialApp( + return MaterialApp( title: 'SpinKit Demo', debugShowCheckedModeBanner: false, - theme: new ThemeData( + theme: ThemeData( brightness: Brightness.dark, ), - home: new Scaffold( + home: Scaffold( body: SafeArea( child: Stack( children: [ diff --git a/example/lib/showcase.dart b/example/lib/showcase.dart index 76fe8e3..b48696f 100644 --- a/example/lib/showcase.dart +++ b/example/lib/showcase.dart @@ -4,18 +4,18 @@ import 'package:flutter_spinkit/flutter_spinkit.dart'; class ShowCase extends StatelessWidget { @override Widget build(BuildContext context) { - return new Scaffold( + return Scaffold( appBar: AppBar( elevation: 0.0, backgroundColor: Colors.transparent, title: Text("SpinKit", style: TextStyle(fontSize: 24.0)), ), body: SingleChildScrollView( - child: new Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox(height: 32.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitRotatingCircle(color: Colors.white), @@ -24,7 +24,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitPumpingHeart(color: Colors.white), @@ -33,7 +33,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitWave(color: Colors.white, type: SpinKitWaveType.start), @@ -42,7 +42,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitThreeBounce(color: Colors.white), @@ -52,7 +52,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitCircle(color: Colors.white), @@ -62,7 +62,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitFadingCube(color: Colors.white), @@ -71,7 +71,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitRing(color: Colors.white), @@ -80,7 +80,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitFadingGrid(color: Colors.white), @@ -90,7 +90,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitSpinningCircle(color: Colors.white), @@ -100,7 +100,7 @@ class ShowCase extends StatelessWidget { ], ), const SizedBox(height: 48.0), - new Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SpinKitPouringHourglass(color: Colors.white), diff --git a/example/lib/workspace.dart b/example/lib/workspace.dart index 242f8af..d88033a 100644 --- a/example/lib/workspace.dart +++ b/example/lib/workspace.dart @@ -5,12 +5,18 @@ class WorkSpace extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - color: Colors.orangeAccent, + color: Colors.white, width: 300.0, height: 300.0, - child: SpinKitPouringHourglass( - color: Colors.white, - size: 100.0, + child: SpinKitFadingCircle( + itemBuilder: (_, int index) { + return DecoratedBox( + decoration: BoxDecoration( + color: index.isEven ? Colors.red : Colors.green, + ), + ); + }, + size: 120.0, ), ); } diff --git a/example/pubspec.lock b/example/pubspec.lock index fb0b048..5e1856f 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -75,7 +75,7 @@ packages: path: ".." relative: true source: path - version: "2.1.0" + version: "3.0.0" flutter_test: dependency: "direct dev" description: flutter diff --git a/lib/flutter_spinkit.dart b/lib/flutter_spinkit.dart index 3bea84f..bdbff50 100644 --- a/lib/flutter_spinkit.dart +++ b/lib/flutter_spinkit.dart @@ -11,6 +11,7 @@ export 'src/fading_four.dart'; export 'src/fading_grid.dart'; export 'src/folding_cube.dart'; export 'src/hour_glass.dart'; +export 'src/pouring_hour_glass.dart'; export 'src/pulse.dart'; export 'src/pumping_heart.dart'; export 'src/ring.dart'; @@ -21,4 +22,3 @@ export 'src/spinning_circle.dart'; export 'src/three_bounce.dart'; export 'src/wandering_cubes.dart'; export 'src/wave.dart'; -export 'src/pouring_hour_glass.dart'; diff --git a/lib/src/chasing_dots.dart b/lib/src/chasing_dots.dart index f76f34e..3d6d053 100644 --- a/lib/src/chasing_dots.dart +++ b/lib/src/chasing_dots.dart @@ -3,15 +3,22 @@ import 'package:flutter/material.dart'; class SpinKitChasingDots extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitChasingDots({ + SpinKitChasingDots({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitChasingDotsState createState() => new _SpinKitChasingDotsState(); + _SpinKitChasingDotsState createState() => _SpinKitChasingDotsState(); } class _SpinKitChasingDotsState extends State @@ -23,11 +30,11 @@ class _SpinKitChasingDotsState extends State @override void initState() { super.initState(); - _scaleCtrl = new AnimationController(vsync: this, duration: _duration); - _rotateCtrl = new AnimationController(vsync: this, duration: _duration); + _scaleCtrl = AnimationController(vsync: this, duration: _duration); + _rotateCtrl = AnimationController(vsync: this, duration: _duration); _scale = Tween(begin: -1.0, end: 1.0).animate( - new CurvedAnimation(parent: _scaleCtrl, curve: Curves.easeInOut), + CurvedAnimation(parent: _scaleCtrl, curve: Curves.easeInOut), ) ..addListener(() => setState(() => {})) ..addStatusListener((status) { @@ -39,7 +46,7 @@ class _SpinKitChasingDotsState extends State }); _rotate = Tween(begin: 0.0, end: 360.0).animate( - new CurvedAnimation(parent: _rotateCtrl, curve: Curves.linear), + CurvedAnimation(parent: _rotateCtrl, curve: Curves.linear), )..addListener(() => setState(() => {})); _rotateCtrl.repeat(); @@ -64,11 +71,11 @@ class _SpinKitChasingDotsState extends State children: [ Positioned( top: 0.0, - child: _circle(1.0 - _scale.value.abs()), + child: _circle(1.0 - _scale.value.abs(), 0), ), Positioned( bottom: 0.0, - child: _circle(_scale.value.abs()), + child: _circle(_scale.value.abs(), 1), ), ], ), @@ -77,19 +84,25 @@ class _SpinKitChasingDotsState extends State ); } - Widget _circle(double scale) { + Widget _itemBuilder(int index) { final _size = widget.size * 0.6; + return SizedBox.fromSize( + size: Size.square(_size), + child: widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.color, + ), + ), + ); + } - return new Transform.scale( + Widget _circle(double scale, int index) { + return Transform.scale( scale: scale, - child: new Container( - height: _size, - width: _size, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: widget.color, - ), - ), + child: _itemBuilder(index), ); } } diff --git a/lib/src/circle.dart b/lib/src/circle.dart index ce6a9f7..d75aa9d 100644 --- a/lib/src/circle.dart +++ b/lib/src/circle.dart @@ -4,15 +4,22 @@ import 'package:flutter_spinkit/src/utils.dart'; class SpinKitCircle extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitCircle({ + SpinKitCircle({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitCircleState createState() => new _SpinKitCircleState(); + _SpinKitCircleState createState() => _SpinKitCircleState(); } class _SpinKitCircleState extends State @@ -22,7 +29,7 @@ class _SpinKitCircleState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)) ..repeat(); } @@ -69,19 +76,26 @@ class _SpinKitCircleState extends State child: Align( alignment: Alignment.center, child: ScaleTransition( - scale: new DelayTween(begin: 0.0, end: 1.0, delay: delay) + scale: DelayTween(begin: 0.0, end: 1.0, delay: delay) .animate(_controller), - child: Container( - width: _size, - height: _size, + child: _itemBuilder(i - 1, _size), + ), + ), + ), + ); + } + + Widget _itemBuilder(int index, double _size) { + return SizedBox.fromSize( + size: Size.square(_size), + child: widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( decoration: BoxDecoration( color: widget.color, shape: BoxShape.circle, ), ), - ), - ), - ), ); } } diff --git a/lib/src/cube_grid.dart b/lib/src/cube_grid.dart index a98cc84..3e6fc9c 100644 --- a/lib/src/cube_grid.dart +++ b/lib/src/cube_grid.dart @@ -3,15 +3,22 @@ import 'package:flutter/widgets.dart'; class SpinKitCubeGrid extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitCubeGrid({ + SpinKitCubeGrid({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitCubeGridState createState() => new _SpinKitCubeGridState(); + _SpinKitCubeGridState createState() => _SpinKitCubeGridState(); } class _SpinKitCubeGridState extends State @@ -22,40 +29,40 @@ class _SpinKitCubeGridState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _anim1 = Tween(begin: 1.0, end: 0.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.1, 0.6, curve: Curves.easeIn), + curve: Interval(0.1, 0.6, curve: Curves.easeIn), ), ); _anim2 = Tween(begin: 1.0, end: 0.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.2, 0.7, curve: Curves.easeIn), + curve: Interval(0.2, 0.7, curve: Curves.easeIn), ), ); _anim3 = Tween(begin: 1.0, end: 0.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.3, 0.8, curve: Curves.easeIn), + curve: Interval(0.3, 0.8, curve: Curves.easeIn), ), ); _anim4 = Tween(begin: 1.0, end: 0.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.4, 0.9, curve: Curves.easeIn), + curve: Interval(0.4, 0.9, curve: Curves.easeIn), ), ); _anim5 = Tween(begin: 1.0, end: 0.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.5, 1.0, curve: Curves.easeIn), + curve: Interval(0.5, 1.0, curve: Curves.easeIn), ), ); @@ -80,38 +87,38 @@ class _SpinKitCubeGridState extends State @override Widget build(BuildContext context) { - return new Container( + return Container( height: widget.size, width: widget.size, - child: new Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _square(_anim3), - _square(_anim4), - _square(_anim5), + _square(_anim3, 0), + _square(_anim4, 1), + _square(_anim5, 2), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _square(_anim2), - _square(_anim3), - _square(_anim4), + _square(_anim2, 3), + _square(_anim3, 4), + _square(_anim4, 5), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _square(_anim1), - _square(_anim2), - _square(_anim3), + _square(_anim1, 6), + _square(_anim2, 7), + _square(_anim3, 8), ], ), ], @@ -119,14 +126,23 @@ class _SpinKitCubeGridState extends State ); } - Widget _square(Animation animation) { - return new ScaleTransition( + Widget _square(Animation animation, int index) { + return ScaleTransition( scale: animation, - child: new Container( - height: widget.size / 3, - width: widget.size / 3, - color: widget.color, - ), + child: _itemBuilder(index), + ); + } + + Widget _itemBuilder(int index) { + return SizedBox.fromSize( + size: Size.square(widget.size / 3), + child: widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + ), + ), ); } } diff --git a/lib/src/double_bounce.dart b/lib/src/double_bounce.dart index b922e5e..84ead51 100644 --- a/lib/src/double_bounce.dart +++ b/lib/src/double_bounce.dart @@ -3,15 +3,22 @@ import 'package:flutter/material.dart'; class SpinKitDoubleBounce extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitDoubleBounce({ + SpinKitDoubleBounce({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitDoubleBounceState createState() => new _SpinKitDoubleBounceState(); + _SpinKitDoubleBounceState createState() => _SpinKitDoubleBounceState(); } class _SpinKitDoubleBounceState extends State @@ -30,11 +37,11 @@ class _SpinKitDoubleBounceState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 2000)); _animation1 = Tween(begin: -1.0, end: 1.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, curve: Curves.easeInOut, ), @@ -56,26 +63,30 @@ class _SpinKitDoubleBounceState extends State return Center( child: Stack( children: [ - new Transform.scale( + Transform.scale( scale: 1.0 - _animation1.value.abs(), - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration( - shape: BoxShape.circle, color: widget.color.withOpacity(0.6)), - ), + child: _itemBuilder(0), ), - new Transform.scale( + Transform.scale( scale: _animation1.value.abs(), - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration( - shape: BoxShape.circle, color: widget.color.withOpacity(0.6)), - ), + child: _itemBuilder(1), ), ], ), ); } + + Widget _itemBuilder(int index) { + return SizedBox.fromSize( + size: Size.square(widget.size), + child: widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.color.withOpacity(0.6), + ), + ), + ); + } } diff --git a/lib/src/dual_ring.dart b/lib/src/dual_ring.dart index 4aa93d7..693cddf 100644 --- a/lib/src/dual_ring.dart +++ b/lib/src/dual_ring.dart @@ -1,4 +1,5 @@ import 'dart:math' as math; + import 'package:flutter/widgets.dart'; class SpinKitDualRing extends StatefulWidget { @@ -9,10 +10,12 @@ class SpinKitDualRing extends StatefulWidget { Key key, @required this.color, this.size = 50.0, - }) : super(key: key); + }) : assert(color != null), + assert(size != null), + super(key: key); @override - _SpinKitDualRingState createState() => new _SpinKitDualRingState(); + _SpinKitDualRingState createState() => _SpinKitDualRingState(); } class _SpinKitDualRingState extends State @@ -23,12 +26,12 @@ class _SpinKitDualRingState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _animation1 = Tween(begin: 0.0, end: 1.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: Curves.linear), + curve: Interval(0.0, 1.0, curve: Curves.linear), ), )..addListener(() => setState(() => {})); @@ -43,14 +46,14 @@ class _SpinKitDualRingState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateZ((_animation1.value) * math.pi * 2); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, child: CustomPaint( - child: new Container( + child: Container( height: widget.size, width: widget.size, ), diff --git a/lib/src/fading_circle.dart b/lib/src/fading_circle.dart index d942481..be2af61 100644 --- a/lib/src/fading_circle.dart +++ b/lib/src/fading_circle.dart @@ -4,15 +4,22 @@ import 'package:flutter_spinkit/src/utils.dart'; class SpinKitFadingCircle extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitFadingCircle({ + SpinKitFadingCircle({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitFadingCircleState createState() => new _SpinKitFadingCircleState(); + _SpinKitFadingCircleState createState() => _SpinKitFadingCircleState(); } class _SpinKitFadingCircleState extends State @@ -22,7 +29,7 @@ class _SpinKitFadingCircleState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)) ..repeat(); } @@ -69,19 +76,26 @@ class _SpinKitFadingCircleState extends State child: Align( alignment: Alignment.center, child: FadeTransition( - opacity: new DelayTween(begin: 0.0, end: 1.0, delay: delay) + opacity: DelayTween(begin: 0.0, end: 1.0, delay: delay) .animate(_controller), - child: Container( - width: _size, - height: _size, - decoration: BoxDecoration( - color: widget.color, - shape: BoxShape.circle, - ), + child: SizedBox.fromSize( + size: Size.square(_size), + child: _itemBuilder(i - 1), ), ), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: BoxShape.circle, + ), + ); + } } diff --git a/lib/src/fading_cube.dart b/lib/src/fading_cube.dart index acfbba5..c9bb648 100644 --- a/lib/src/fading_cube.dart +++ b/lib/src/fading_cube.dart @@ -1,19 +1,25 @@ import 'package:flutter/widgets.dart'; - import 'package:flutter_spinkit/src/utils.dart'; class SpinKitFadingCube extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitFadingCube({ + SpinKitFadingCube({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitFadingCubeState createState() => new _SpinKitFadingCubeState(); + _SpinKitFadingCubeState createState() => _SpinKitFadingCubeState(); } class _SpinKitFadingCubeState extends State @@ -24,7 +30,7 @@ class _SpinKitFadingCubeState extends State @override void initState() { super.initState(); - _opacityCtrl = new AnimationController(vsync: this, duration: _duration) + _opacityCtrl = AnimationController(vsync: this, duration: _duration) ..repeat(); } @@ -72,10 +78,9 @@ class _SpinKitFadingCubeState extends State child: FadeTransition( opacity: DelayTween(begin: 0.0, end: 1.0, delay: 0.3 * (i - 1)) .animate(_opacityCtrl), - child: new Container( - height: _size, - width: _size, - decoration: BoxDecoration(color: widget.color), + child: SizedBox.fromSize( + size: Size.square(_size), + child: _itemBuilder(i - 1), ), ), ), @@ -83,4 +88,14 @@ class _SpinKitFadingCubeState extends State ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + ), + ); + } } diff --git a/lib/src/fading_four.dart b/lib/src/fading_four.dart index d3c3785..92903a4 100644 --- a/lib/src/fading_four.dart +++ b/lib/src/fading_four.dart @@ -5,16 +5,24 @@ class SpinKitFadingFour extends StatefulWidget { final Color color; final BoxShape shape; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitFadingFour({ + SpinKitFadingFour({ Key key, - @required this.color, + this.color, this.shape = BoxShape.circle, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(shape != null), + assert(size != null), + super(key: key); @override - _SpinKitFadingFourState createState() => new _SpinKitFadingFourState(); + _SpinKitFadingFourState createState() => _SpinKitFadingFourState(); } class _SpinKitFadingFourState extends State @@ -24,7 +32,7 @@ class _SpinKitFadingFourState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)) ..repeat(); } @@ -42,17 +50,17 @@ class _SpinKitFadingFourState extends State size: Size.square(widget.size), child: Stack( children: [ - _circle(1, .0), - _circle(4, -0.9), - _circle(7, -0.6), - _circle(10, -0.3), + _circle(0, 1, .0), + _circle(1, 4, -0.9), + _circle(2, 7, -0.6), + _circle(3, 10, -0.3), ], ), ), ); } - Widget _circle(int i, [double delay]) { + Widget _circle(int index, int i, [double delay]) { final _size = widget.size * 0.25, _position = widget.size * .5; return Positioned.fill( @@ -63,19 +71,26 @@ class _SpinKitFadingFourState extends State child: Align( alignment: Alignment.center, child: FadeTransition( - opacity: new DelayTween(begin: 0.0, end: 1.0, delay: delay) + opacity: DelayTween(begin: 0.0, end: 1.0, delay: delay) .animate(_controller), - child: Container( - width: _size, - height: _size, - decoration: BoxDecoration( - color: widget.color, - shape: widget.shape, - ), + child: SizedBox.fromSize( + size: Size.square(_size), + child: _itemBuilder(index), ), ), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: widget.shape, + ), + ); + } } diff --git a/lib/src/fading_grid.dart b/lib/src/fading_grid.dart index 0b6b4a1..7be44d4 100644 --- a/lib/src/fading_grid.dart +++ b/lib/src/fading_grid.dart @@ -5,16 +5,24 @@ class SpinKitFadingGrid extends StatefulWidget { final Color color; final BoxShape shape; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitFadingGrid({ + SpinKitFadingGrid({ Key key, - @required this.color, + this.color, this.shape = BoxShape.circle, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(shape != null), + assert(size != null), + super(key: key); @override - _SpinKitFadingGridState createState() => new _SpinKitFadingGridState(); + _SpinKitFadingGridState createState() => _SpinKitFadingGridState(); } class _SpinKitFadingGridState extends State @@ -24,7 +32,7 @@ class _SpinKitFadingGridState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)) ..repeat(); } @@ -37,29 +45,29 @@ class _SpinKitFadingGridState extends State @override Widget build(BuildContext context) { - return new Container( + return Container( height: widget.size, width: widget.size, - child: new Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _circle(1), + _circle(0, 1), SizedBox( width: widget.size / 8, ), - _circle(1), + _circle(1, 1), SizedBox( width: widget.size / 8, ), - _circle(2), + _circle(2, 2), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -69,22 +77,22 @@ class _SpinKitFadingGridState extends State ), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _circle(4), + _circle(3, 4), SizedBox( width: widget.size / 8, ), - _circle(1), + _circle(4, 1), SizedBox( width: widget.size / 8, ), - _circle(2), + _circle(5, 2), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -94,19 +102,19 @@ class _SpinKitFadingGridState extends State ), ], ), - new Row( + Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ - _circle(4), + _circle(6, 4), SizedBox( width: widget.size / 8, ), - _circle(3), + _circle(7, 3), SizedBox( width: widget.size / 8, ), - _circle(3), + _circle(8, 3), ], ), ], @@ -114,15 +122,25 @@ class _SpinKitFadingGridState extends State ); } - Widget _circle(int i) { - return new FadeTransition( + Widget _circle(int index, int i) { + return FadeTransition( opacity: DelayTween(begin: 0.4, end: 0.9, delay: 0.3 * (i - 1)) .animate(_controller), - child: new Container( - height: widget.size / 4, - width: widget.size / 4, - decoration: BoxDecoration(shape: widget.shape, color: widget.color), + child: SizedBox.fromSize( + size: Size.square(widget.size / 4), + child: _itemBuilder(index), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: widget.shape, + ), + ); + } } diff --git a/lib/src/folding_cube.dart b/lib/src/folding_cube.dart index d593adf..9bed1fb 100644 --- a/lib/src/folding_cube.dart +++ b/lib/src/folding_cube.dart @@ -3,15 +3,22 @@ import 'package:flutter/widgets.dart'; class SpinKitFoldingCube extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitFoldingCube({ + SpinKitFoldingCube({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitFoldingCubeState createState() => new _SpinKitFoldingCubeState(); + _SpinKitFoldingCubeState createState() => _SpinKitFoldingCubeState(); } class _SpinKitFoldingCubeState extends State @@ -23,7 +30,7 @@ class _SpinKitFoldingCubeState extends State @override void initState() { super.initState(); - _rotateCtrl = new AnimationController(vsync: this, duration: _duration); + _rotateCtrl = AnimationController(vsync: this, duration: _duration); _rotateCtrl ..addStatusListener((status) { @@ -36,28 +43,28 @@ class _SpinKitFoldingCubeState extends State }); _rotate1 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _rotateCtrl, curve: Interval(0.0, 0.25, curve: Curves.easeIn), ), )..addListener(() => setState(() => {})); _rotate2 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _rotateCtrl, curve: Interval(0.25, 0.5, curve: Curves.easeIn), ), )..addListener(() => setState(() => {})); _rotate3 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _rotateCtrl, curve: Interval(0.5, 0.75, curve: Curves.easeIn), ), )..addListener(() => setState(() => {})); _rotate4 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _rotateCtrl, curve: Interval(0.75, 1.0, curve: Curves.easeIn), ), @@ -97,7 +104,7 @@ class _SpinKitFoldingCubeState extends State Widget _cube(int i, {Animation animation}) { final _size = widget.size * 0.5, _position = widget.size * .5; - final Matrix4 _tRotate = new Matrix4.identity() + final Matrix4 _tRotate = Matrix4.identity() ..rotateY(animation.value * 0.0174533); return Positioned.fill( @@ -107,15 +114,14 @@ class _SpinKitFoldingCubeState extends State transform: Matrix4.rotationZ(90.0 * (i - 1) * 0.0174533), child: Align( alignment: Alignment.center, - child: new Transform( + child: Transform( transform: _tRotate, alignment: Alignment.centerLeft, - child: new Opacity( + child: Opacity( opacity: 1.0 - (animation.value / 180.0), - child: new Container( - height: _size, - width: _size, - decoration: BoxDecoration(color: widget.color), + child: SizedBox.fromSize( + size: Size.square(_size / 4), + child: _itemBuilder(i - 1), ), ), ), @@ -123,4 +129,14 @@ class _SpinKitFoldingCubeState extends State ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + ), + ); + } } diff --git a/lib/src/hour_glass.dart b/lib/src/hour_glass.dart index 2c60558..7f280fc 100644 --- a/lib/src/hour_glass.dart +++ b/lib/src/hour_glass.dart @@ -1,4 +1,5 @@ import 'dart:math' as math; + import 'package:flutter/widgets.dart'; class SpinKitHourGlass extends StatefulWidget { @@ -9,10 +10,12 @@ class SpinKitHourGlass extends StatefulWidget { Key key, @required this.color, this.size = 50.0, - }) : super(key: key); + }) : assert(color != null), + assert(size != null), + super(key: key); @override - _SpinKitHourGlassState createState() => new _SpinKitHourGlassState(); + _SpinKitHourGlassState createState() => _SpinKitHourGlassState(); } class _SpinKitHourGlassState extends State @@ -23,12 +26,12 @@ class _SpinKitHourGlassState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _animation1 = Tween(begin: 0.0, end: 8.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: Curves.easeOut), + curve: Interval(0.0, 1.0, curve: Curves.easeOut), ), )..addListener(() => setState(() => {})); @@ -43,14 +46,14 @@ class _SpinKitHourGlassState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateZ((_animation1.value) * math.pi); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, child: CustomPaint( - child: new Container( + child: Container( height: widget.size, width: widget.size, ), diff --git a/lib/src/pouring_hour_glass.dart b/lib/src/pouring_hour_glass.dart index 288446b..823f723 100644 --- a/lib/src/pouring_hour_glass.dart +++ b/lib/src/pouring_hour_glass.dart @@ -17,7 +17,7 @@ class SpinKitPouringHourglass extends StatefulWidget { @override _SpinKitPouringHourglassState createState() => - new _SpinKitPouringHourglassState(); + _SpinKitPouringHourglassState(); } class _SpinKitPouringHourglassState extends State @@ -30,7 +30,7 @@ class _SpinKitPouringHourglassState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 2400), ); diff --git a/lib/src/pulse.dart b/lib/src/pulse.dart index 4b6fe12..e7ad557 100644 --- a/lib/src/pulse.dart +++ b/lib/src/pulse.dart @@ -3,15 +3,22 @@ import 'package:flutter/material.dart'; class SpinKitPulse extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitPulse({ + SpinKitPulse({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitPulseState createState() => new _SpinKitPulseState(); + _SpinKitPulseState createState() => _SpinKitPulseState(); } class _SpinKitPulseState extends State @@ -23,7 +30,7 @@ class _SpinKitPulseState extends State void initState() { super.initState(); _controller = - new AnimationController(vsync: this, duration: Duration(seconds: 1)); + AnimationController(vsync: this, duration: Duration(seconds: 1)); _animation = CurveTween(curve: Curves.easeInOut).animate(_controller) ..addListener( () => setState(() => {}), @@ -43,16 +50,25 @@ class _SpinKitPulseState extends State return Center( child: Opacity( opacity: 1.0 - _animation.value, - child: new Transform.scale( + child: Transform.scale( scale: _animation.value, - child: new Container( - height: widget.size, - width: widget.size, - decoration: - BoxDecoration(shape: BoxShape.circle, color: widget.color), + child: SizedBox.fromSize( + size: Size.square(widget.size), + child: _itemBuilder(0), ), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.color, + ), + ); + } } diff --git a/lib/src/pumping_heart.dart b/lib/src/pumping_heart.dart index df4514c..bffe4b2 100644 --- a/lib/src/pumping_heart.dart +++ b/lib/src/pumping_heart.dart @@ -6,15 +6,22 @@ import 'package:flutter/widgets.dart'; class SpinKitPumpingHeart extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitPumpingHeart({ + SpinKitPumpingHeart({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitPumpingHeartState createState() => new _SpinKitPumpingHeartState(); + _SpinKitPumpingHeartState createState() => _SpinKitPumpingHeartState(); } class _SpinKitPumpingHeartState extends State @@ -25,12 +32,13 @@ class _SpinKitPumpingHeartState extends State @override void initState() { super.initState(); - _controller = new AnimationController( - vsync: this, duration: Duration(milliseconds: 2400)) - ..repeat(); - _anim1 = Tween(begin: 1.0, end: 1.25).animate(new CurvedAnimation( + _controller = AnimationController( + vsync: this, + duration: Duration(milliseconds: 2400), + )..repeat(); + _anim1 = Tween(begin: 1.0, end: 1.25).animate(CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: MyCurve()), + curve: Interval(0.0, 1.0, curve: MyCurve()), )); } @@ -42,15 +50,21 @@ class _SpinKitPumpingHeartState extends State @override Widget build(BuildContext context) { - return new ScaleTransition( + return ScaleTransition( scale: _anim1, - child: Icon( - Icons.favorite, - color: widget.color, - size: widget.size, - ), + child: _itemBuilder(0), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : Icon( + Icons.favorite, + color: widget.color, + size: widget.size, + ); + } } class MyCurve extends Curve { diff --git a/lib/src/ring.dart b/lib/src/ring.dart index 9914bb6..d87c991 100644 --- a/lib/src/ring.dart +++ b/lib/src/ring.dart @@ -1,4 +1,5 @@ import 'dart:math'; + import 'package:flutter/widgets.dart'; class SpinKitRing extends StatefulWidget { @@ -11,10 +12,13 @@ class SpinKitRing extends StatefulWidget { @required this.color, this.lineWidth = 7.0, this.size = 50.0, - }) : super(key: key); + }) : assert(color != null), + assert(lineWidth != null), + assert(size != null), + super(key: key); @override - _SpinKitRingState createState() => new _SpinKitRingState(); + _SpinKitRingState createState() => _SpinKitRingState(); } class _SpinKitRingState extends State @@ -25,26 +29,26 @@ class _SpinKitRingState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1500)); _animation1 = Tween(begin: 0.0, end: 1.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: Curves.linear), + curve: Interval(0.0, 1.0, curve: Curves.linear), ), )..addListener(() => setState(() => {})); _animation2 = Tween(begin: -2 / 3, end: 1 / 2).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.5, 1.0, curve: Curves.linear), + curve: Interval(0.5, 1.0, curve: Curves.linear), ), )..addListener(() => setState(() => {})); _animation3 = Tween(begin: 0.25, end: 5 / 6).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: _MyCurve()), + curve: Interval(0.0, 1.0, curve: _MyCurve()), ), )..addListener(() => setState(() => {})); @@ -59,13 +63,13 @@ class _SpinKitRingState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateZ((_animation1.value) * 5 * pi / 6); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, - child: new Container( + child: Container( height: widget.size, width: widget.size, child: CustomPaint( diff --git a/lib/src/ripple.dart b/lib/src/ripple.dart index 26eb75d..24d8ddb 100644 --- a/lib/src/ripple.dart +++ b/lib/src/ripple.dart @@ -3,15 +3,25 @@ import 'package:flutter/material.dart'; class SpinKitRipple extends StatefulWidget { final Color color; final double size; + final double borderWidth; + final IndexedWidgetBuilder itemBuilder; - const SpinKitRipple({ + SpinKitRipple({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.borderWidth = 6.0, + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + assert(borderWidth != null), + super(key: key); @override - _SpinKitRippleState createState() => new _SpinKitRippleState(); + _SpinKitRippleState createState() => _SpinKitRippleState(); } class _SpinKitRippleState extends State @@ -22,19 +32,19 @@ class _SpinKitRippleState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1800)) ..repeat(); _animation1 = Tween(begin: 0.0, end: 1.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, curve: Interval(0.0, 0.75, curve: Curves.linear), ), )..addListener(() => setState(() => {})); _animation2 = Tween(begin: 0.0, end: 1.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, curve: Interval(0.25, 1.0, curve: Curves.linear), ), @@ -54,34 +64,35 @@ class _SpinKitRippleState extends State children: [ Opacity( opacity: 1.0 - _animation1.value, - child: new Transform.scale( + child: Transform.scale( scale: _animation1.value, - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all(color: widget.color, width: 10.0), - ), - ), + child: _itemBuilder(0), ), ), Opacity( - opacity: 1.0 - _animation1.value, - child: new Transform.scale( + opacity: 1.0 - _animation2.value, + child: Transform.scale( scale: _animation2.value, - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all(color: widget.color, width: 10.0), - ), - ), + child: _itemBuilder(1), ), ), ], ), ); } + + Widget _itemBuilder(int index) { + return SizedBox.fromSize( + size: Size.square(widget.size), + child: widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: + Border.all(color: widget.color, width: widget.borderWidth), + ), + ), + ); + } } diff --git a/lib/src/rotating_circle.dart b/lib/src/rotating_circle.dart index a8e482c..c5602a3 100644 --- a/lib/src/rotating_circle.dart +++ b/lib/src/rotating_circle.dart @@ -3,16 +3,23 @@ import 'package:flutter/widgets.dart'; class SpinKitRotatingCircle extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitRotatingCircle({ + SpinKitRotatingCircle({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override _SpinKitRotatingCircleState createState() => - new _SpinKitRotatingCircleState(); + _SpinKitRotatingCircleState(); } class _SpinKitRotatingCircleState extends State @@ -24,19 +31,19 @@ class _SpinKitRotatingCircleState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _animation1 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 0.5, curve: Curves.easeIn), + curve: Interval(0.0, 0.5, curve: Curves.easeIn), ), )..addListener(() => setState(() => {})); _animation2 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.5, 1.0, curve: Curves.easeOut), + curve: Interval(0.5, 1.0, curve: Curves.easeOut), ), )..addListener(() => setState(() => {})); @@ -51,20 +58,29 @@ class _SpinKitRotatingCircleState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateX((0 - _animation1.value) * 0.0174533) ..rotateY((0 - _animation2.value) * 0.0174533); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, - child: new Container( - height: widget.size, - width: widget.size, - decoration: - BoxDecoration(shape: BoxShape.circle, color: widget.color), + child: SizedBox.fromSize( + size: Size.square(widget.size), + child: _itemBuilder(0), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: BoxShape.circle, + ), + ); + } } diff --git a/lib/src/rotating_plain.dart b/lib/src/rotating_plain.dart index b2e7133..61f859f 100644 --- a/lib/src/rotating_plain.dart +++ b/lib/src/rotating_plain.dart @@ -3,15 +3,22 @@ import 'package:flutter/widgets.dart'; class SpinKitRotatingPlain extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitRotatingPlain({ + SpinKitRotatingPlain({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitRotatingPlainState createState() => new _SpinKitRotatingPlainState(); + _SpinKitRotatingPlainState createState() => _SpinKitRotatingPlainState(); } class _SpinKitRotatingPlainState extends State @@ -23,19 +30,19 @@ class _SpinKitRotatingPlainState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _animation1 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 0.5, curve: Curves.easeIn), + curve: Interval(0.0, 0.5, curve: Curves.easeIn), ), )..addListener(() => setState(() => {})); _animation2 = Tween(begin: 0.0, end: 180.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.5, 1.0, curve: Curves.easeOut), + curve: Interval(0.5, 1.0, curve: Curves.easeOut), ), )..addListener(() => setState(() => {})); @@ -50,19 +57,28 @@ class _SpinKitRotatingPlainState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateX((0 - _animation1.value) * 0.0174533) ..rotateY((0 - _animation2.value) * 0.0174533); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration(color: widget.color), + child: SizedBox.fromSize( + size: Size.square(widget.size), + child: _itemBuilder(0), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + ), + ); + } } diff --git a/lib/src/spinning_circle.dart b/lib/src/spinning_circle.dart index 5bdf496..17473f2 100644 --- a/lib/src/spinning_circle.dart +++ b/lib/src/spinning_circle.dart @@ -1,21 +1,30 @@ import 'dart:math'; + import 'package:flutter/widgets.dart'; class SpinKitSpinningCircle extends StatefulWidget { final Color color; final BoxShape shape; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitSpinningCircle({ + SpinKitSpinningCircle({ Key key, - @required this.color, + this.color, this.shape = BoxShape.circle, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(shape != null), + assert(size != null), + super(key: key); @override _SpinKitSpinningCircleState createState() => - new _SpinKitSpinningCircleState(); + _SpinKitSpinningCircleState(); } class _SpinKitSpinningCircleState extends State @@ -26,12 +35,12 @@ class _SpinKitSpinningCircleState extends State @override void initState() { super.initState(); - _controller = new AnimationController( + _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1200)); _animation1 = Tween(begin: 0.0, end: 7.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _controller, - curve: new Interval(0.0, 1.0, curve: Curves.easeOut), + curve: Interval(0.0, 1.0, curve: Curves.easeOut), ), )..addListener(() => setState(() => {})); @@ -46,18 +55,28 @@ class _SpinKitSpinningCircleState extends State @override Widget build(BuildContext context) { - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..rotateY((0 - _animation1.value) * pi); return Center( - child: new Transform( + child: Transform( transform: transform, alignment: FractionalOffset.center, - child: new Container( - height: widget.size, - width: widget.size, - decoration: BoxDecoration(shape: widget.shape, color: widget.color), + child: SizedBox.fromSize( + size: Size.square(widget.size), + child: _itemBuilder(0), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: widget.shape, + ), + ); + } } diff --git a/lib/src/three_bounce.dart b/lib/src/three_bounce.dart index e9312db..19e8eec 100644 --- a/lib/src/three_bounce.dart +++ b/lib/src/three_bounce.dart @@ -4,15 +4,22 @@ import 'package:flutter_spinkit/src/utils.dart'; class SpinKitThreeBounce extends StatefulWidget { final Color color; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitThreeBounce({ + SpinKitThreeBounce({ Key key, - @required this.color, + this.color, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(size != null), + super(key: key); @override - _SpinKitThreeBounceState createState() => new _SpinKitThreeBounceState(); + _SpinKitThreeBounceState createState() => _SpinKitThreeBounceState(); } class _SpinKitThreeBounceState extends State @@ -23,7 +30,7 @@ class _SpinKitThreeBounceState extends State @override void initState() { super.initState(); - _scaleCtrl = new AnimationController( + _scaleCtrl = AnimationController( vsync: this, duration: _duration, )..repeat(); @@ -43,28 +50,35 @@ class _SpinKitThreeBounceState extends State child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - _circle(.0), - _circle(.2), - _circle(.4), + _circle(0, .0), + _circle(1, .2), + _circle(2, .4), ], ), ), ); } - Widget _circle(double delay) { + Widget _circle(int index, double delay) { final _size = widget.size * 0.5; - return new ScaleTransition( - scale: new DelayTween(begin: 0.0, end: 1.0, delay: delay) + return ScaleTransition( + scale: DelayTween(begin: 0.0, end: 1.0, delay: delay) .animate(_scaleCtrl), - child: new Container( - height: _size, - width: _size, - decoration: new BoxDecoration( - shape: BoxShape.circle, - color: widget.color, - ), + child: SizedBox.fromSize( + size: Size.square(_size), + child: _itemBuilder(index), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: BoxShape.circle, + ), + ); + } } diff --git a/lib/src/wandering_cubes.dart b/lib/src/wandering_cubes.dart index 2edb26c..7fe44ce 100644 --- a/lib/src/wandering_cubes.dart +++ b/lib/src/wandering_cubes.dart @@ -4,17 +4,25 @@ class SpinKitWanderingCubes extends StatefulWidget { final Color color; final BoxShape shape; final double size; + final IndexedWidgetBuilder itemBuilder; - const SpinKitWanderingCubes({ + SpinKitWanderingCubes({ Key key, - @required this.color, + this.color, this.shape = BoxShape.rectangle, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(shape != null), + assert(size != null), + super(key: key); @override _SpinKitWanderingCubesState createState() => - new _SpinKitWanderingCubesState(); + _SpinKitWanderingCubesState(); } class _SpinKitWanderingCubesState extends State @@ -26,31 +34,31 @@ class _SpinKitWanderingCubesState extends State double _offset; void initTranslateAnim() { - _translateCtrl = new AnimationController(vsync: this, duration: _duration); + _translateCtrl = AnimationController(vsync: this, duration: _duration); _translate1 = Tween(begin: 0.0, end: _offset).animate( - new CurvedAnimation( + CurvedAnimation( parent: _translateCtrl, curve: Interval(0.0, 0.25, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _translate2 = Tween(begin: 0.0, end: _offset).animate( - new CurvedAnimation( + CurvedAnimation( parent: _translateCtrl, curve: Interval(0.25, 0.5, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _translate3 = Tween(begin: 0.0, end: -_offset).animate( - new CurvedAnimation( + CurvedAnimation( parent: _translateCtrl, curve: Interval(0.5, 0.75, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _translate4 = Tween(begin: 0.0, end: -_offset).animate( - new CurvedAnimation( + CurvedAnimation( parent: _translateCtrl, curve: Interval(0.75, 1.0, curve: Curves.easeInOut), ), @@ -60,31 +68,31 @@ class _SpinKitWanderingCubesState extends State } void initScaleAnim() { - _scaleCtrl = new AnimationController(vsync: this, duration: _duration); + _scaleCtrl = AnimationController(vsync: this, duration: _duration); _scale1 = Tween(begin: 1.0, end: 0.5).animate( - new CurvedAnimation( + CurvedAnimation( parent: _scaleCtrl, curve: Interval(0.0, 0.25, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _scale2 = Tween(begin: 1.0, end: 2.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _scaleCtrl, curve: Interval(0.25, 0.5, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _scale3 = Tween(begin: 1.0, end: 0.5).animate( - new CurvedAnimation( + CurvedAnimation( parent: _scaleCtrl, curve: Interval(0.5, 0.75, curve: Curves.easeInOut), ), )..addListener(() => setState(() => {})); _scale4 = Tween(begin: 1.0, end: 2.0).animate( - new CurvedAnimation( + CurvedAnimation( parent: _scaleCtrl, curve: Interval(0.75, 1.0, curve: Curves.easeInOut), ), @@ -101,10 +109,10 @@ class _SpinKitWanderingCubesState extends State initTranslateAnim(); initScaleAnim(); - _rotateCtrl = new AnimationController(vsync: this, duration: _duration); + _rotateCtrl = AnimationController(vsync: this, duration: _duration); _rotate = Tween(begin: 0.0, end: 360.0).animate( - new CurvedAnimation(parent: _translateCtrl, curve: Curves.linear), + CurvedAnimation(parent: _translateCtrl, curve: Curves.linear), )..addListener(() => setState(() => {})); _rotateCtrl.repeat(); @@ -125,17 +133,17 @@ class _SpinKitWanderingCubesState extends State size: Size.square(widget.size), child: Stack( children: [ - _cube(), - _cube(true), + _cube(0), + _cube(1, true), ], ), ), ); } - Widget _cube([bool offset = false]) { + Widget _cube(int index, [bool offset = false]) { final _size = widget.size * 0.25; - final Matrix4 _tScale = new Matrix4.identity() + final Matrix4 _tScale = Matrix4.identity() ..scale(_scale2.value) ..scale(_scale3.value) ..scale(_scale4.value) @@ -143,13 +151,13 @@ class _SpinKitWanderingCubesState extends State Matrix4 _tTranslate; if (offset == true) { - _tTranslate = new Matrix4.identity() + _tTranslate = Matrix4.identity() ..translate(_translate3.value, 0.0) ..translate(0.0, _translate2.value) ..translate(0.0, _translate4.value) ..translate(_translate1.value, 0.0); } else { - _tTranslate = new Matrix4.identity() + _tTranslate = Matrix4.identity() ..translate(0.0, _translate3.value) ..translate(-_translate2.value, 0.0) ..translate(-_translate4.value, 0.0) @@ -159,23 +167,30 @@ class _SpinKitWanderingCubesState extends State return Positioned( top: 0.0, left: offset == true ? 0.0 : _offset, - child: new Transform( + child: Transform( transform: _tTranslate, - child: new Transform.rotate( + child: Transform.rotate( angle: _rotate.value * 0.0174533, child: Transform( transform: _tScale, - child: new Container( - height: _size, - width: _size, - decoration: BoxDecoration( - shape: widget.shape, - color: widget.color, - ), + child: SizedBox.fromSize( + size: Size.square(_size), + child: _itemBuilder(index), ), ), ), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + shape: widget.shape, + ), + ); + } } diff --git a/lib/src/wave.dart b/lib/src/wave.dart index 78489f7..26f5d27 100644 --- a/lib/src/wave.dart +++ b/lib/src/wave.dart @@ -7,16 +7,24 @@ class SpinKitWave extends StatefulWidget { final Color color; final double size; final SpinKitWaveType type; + final IndexedWidgetBuilder itemBuilder; - const SpinKitWave({ + SpinKitWave({ Key key, - @required this.color, + this.color, this.type = SpinKitWaveType.start, this.size = 50.0, - }) : super(key: key); + this.itemBuilder, + }) : assert( + !(itemBuilder is IndexedWidgetBuilder && color is Color) && + !(itemBuilder == null && color == null), + 'You should specify either a itemBuilder or a color'), + assert(type != null), + assert(size != null), + super(key: key); @override - _SpinKitWaveState createState() => new _SpinKitWaveState(); + _SpinKitWaveState createState() => _SpinKitWaveState(); } class _SpinKitWaveState extends State @@ -27,7 +35,7 @@ class _SpinKitWaveState extends State @override void initState() { super.initState(); - _scaleCtrl = new AnimationController( + _scaleCtrl = AnimationController( vsync: this, duration: _duration, )..repeat(); @@ -44,27 +52,27 @@ class _SpinKitWaveState extends State List _bars; if (widget.type == SpinKitWaveType.start) { _bars = [ - _bar(-1.2), - _bar(-1.1), - _bar(-1.0), - _bar(-.9), - _bar(-.8), + _bar(0, -1.2), + _bar(1, -1.1), + _bar(2, -1.0), + _bar(3, -.9), + _bar(4, -.8), ]; } else if (widget.type == SpinKitWaveType.end) { _bars = [ - _bar(-.8), - _bar(-.9), - _bar(-1.0), - _bar(-1.1), - _bar(-1.2), + _bar(0, -.8), + _bar(1, -.9), + _bar(2, -1.0), + _bar(3, -1.1), + _bar(4, -1.2), ]; } else if (widget.type == SpinKitWaveType.center) { _bars = [ - _bar(-0.75), - _bar(-0.95), - _bar(-1.2), - _bar(-0.95), - _bar(-0.75), + _bar(0, -0.75), + _bar(1, -0.95), + _bar(2, -1.2), + _bar(3, -0.95), + _bar(4, -0.75), ]; } return Center( @@ -78,20 +86,30 @@ class _SpinKitWaveState extends State ); } - Widget _bar(double delay) { + Widget _bar(int index, double delay) { final _size = widget.size * 0.2; - return new ScaleYWidget( - scaleY: - new DelayTween(begin: .4, end: 1.0, delay: delay).animate(_scaleCtrl), - child: new Container( - height: widget.size, - width: _size, - decoration: new BoxDecoration( - color: widget.color, - ), + return ScaleYWidget( + scaleY: DelayTween( + begin: .4, + end: 1.0, + delay: delay, + ).animate(_scaleCtrl), + child: SizedBox.fromSize( + size: Size(_size, widget.size), + child: _itemBuilder(index), ), ); } + + Widget _itemBuilder(int index) { + return widget.itemBuilder != null + ? widget.itemBuilder(context, index) + : DecoratedBox( + decoration: BoxDecoration( + color: widget.color, + ), + ); + } } class ScaleYWidget extends AnimatedWidget { @@ -110,9 +128,9 @@ class ScaleYWidget extends AnimatedWidget { @override Widget build(BuildContext context) { final double scaleValue = scaleY.value; - final Matrix4 transform = new Matrix4.identity() + final Matrix4 transform = Matrix4.identity() ..scale(1.0, scaleValue, 1.0); - return new Transform( + return Transform( transform: transform, alignment: alignment, child: child, diff --git a/pubspec.yaml b/pubspec.yaml index 6ae5e91..5b72bb5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_spinkit description: A collection of loading indicators animated with flutter. Heavily inspired by @tobiasahlin's SpinKit. -version: 2.1.0 +version: 3.0.0 homepage: https://github.com/jogboms/flutter_spinkit authors: diff --git a/screenshots/itemBuilder.gif b/screenshots/itemBuilder.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a2b48b0c4804a1aef65da3abe8a17110b6aa35a GIT binary patch literal 59364 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 Vw@InrydREk?LWL`1$?}j{~vwqsvZCU literal 0 HcmV?d00001