From 23e7550212c07ce03f79b9f6a278e8cadb2d4bc0 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 7 Sep 2025 16:12:53 +0300 Subject: [PATCH] counter animation added. --- .../number_incremental_animation.dart | 40 +++++++++++++++++++ .../widgets/progress_fragment.dart | 2 +- .../common_widgets/custom_badge.dart | 16 +++++--- 3 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 lib/animations/number_incremental_animation.dart diff --git a/lib/animations/number_incremental_animation.dart b/lib/animations/number_incremental_animation.dart new file mode 100644 index 00000000..775909cb --- /dev/null +++ b/lib/animations/number_incremental_animation.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class CounterAnimatedText extends ImplicitlyAnimatedWidget { + final int value; + final TextStyle? style; + + const CounterAnimatedText({ + super.key, + super.duration = const Duration(milliseconds: 750), + required this.value, + this.style, + }); + + @override + ImplicitlyAnimatedWidgetState createState() => _CounterTextState(); +} + +class _CounterTextState extends AnimatedWidgetBaseState { + late IntTween _counter; + + @override + void initState() { + _counter = IntTween(begin: widget.value, end: widget.value); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Text('${_counter.evaluate(animation)}', style: widget.style); + } + + @override + void forEachTween(TweenVisitor visitor) { + _counter = visitor( + _counter, + widget.value, + (dynamic value) => IntTween(begin: value), + ) as IntTween; + } +} diff --git a/lib/dashboard_latest/widgets/progress_fragment.dart b/lib/dashboard_latest/widgets/progress_fragment.dart index f6533c91..a56f54e6 100644 --- a/lib/dashboard_latest/widgets/progress_fragment.dart +++ b/lib/dashboard_latest/widgets/progress_fragment.dart @@ -213,7 +213,7 @@ class ProgressFragment extends StatelessWidget { children: [ PieChart( dataMap: {for (var v in chartData) v.x: v.y}, - animationDuration: const Duration(milliseconds: 800), + animationDuration: const Duration(milliseconds: 750), chartLegendSpacing: 32, chartRadius: MediaQuery.of(context).size.width / 3.2, colorList: chartData.map((element) => element.color).toList(), diff --git a/lib/new_views/common_widgets/custom_badge.dart b/lib/new_views/common_widgets/custom_badge.dart index 6970afd5..654304ec 100644 --- a/lib/new_views/common_widgets/custom_badge.dart +++ b/lib/new_views/common_widgets/custom_badge.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/animations/number_incremental_animation.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class CustomBadge extends StatelessWidget { @@ -19,22 +20,25 @@ class CustomBadge extends StatelessWidget { clipBehavior: Clip.none, // Allows the badge to overflow its container. children: [ child, // The main widget - if (value > 0) - Positioned( - right: -6, - top: -6, + // if (value > 0) + Positioned( + right: -6, + top: -6, + child: Opacity( + opacity: value > 0 ? 1 : 0, child: Container( height: 23, constraints: const BoxConstraints(minWidth: 23), padding: const EdgeInsets.all(3), alignment: Alignment.center, decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(30)), - child: Text( - value.toString(), + child: CounterAnimatedText( + value: value, style: const TextStyle(color: AppColor.white10, fontFamily: 'Poppins', fontSize: 10, fontWeight: FontWeight.w700), ), ), ), + ), ], ); }