feat: custom appbar

This commit is contained in:
efrilm
2025-08-16 00:39:09 +07:00
parent d334bb8f17
commit d73cd1a574
16 changed files with 207 additions and 1062 deletions
+2 -23
View File
@@ -2,8 +2,8 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import '../../../common/theme/theme.dart';
import '../../components/appbar/appbar.dart';
import '../../components/spacer/spacer.dart';
import 'widgets/appbar.dart';
import 'widgets/summary_card.dart';
// Data Models
@@ -70,9 +70,6 @@ class SalesPage extends StatefulWidget {
}
class _SalesPageState extends State<SalesPage> with TickerProviderStateMixin {
late AnimationController rotationAnimationController;
late Animation<double> rotationAnimation;
late AnimationController slideAnimationController;
late Animation<Offset> slideAnimation;
@@ -82,23 +79,6 @@ class _SalesPageState extends State<SalesPage> with TickerProviderStateMixin {
void initState() {
super.initState();
// Rotation Animation
rotationAnimationController = AnimationController(
duration: const Duration(seconds: 20),
vsync: this,
);
rotationAnimation =
Tween<double>(
begin: 0,
end: 6.28, // 2 * PI
).animate(
CurvedAnimation(
parent: rotationAnimationController,
curve: Curves.linear,
),
);
rotationAnimationController.repeat();
// Slide Animation
slideAnimationController = AnimationController(
duration: const Duration(milliseconds: 800),
@@ -130,7 +110,6 @@ class _SalesPageState extends State<SalesPage> with TickerProviderStateMixin {
@override
void dispose() {
rotationAnimationController.dispose();
slideAnimationController.dispose();
fadeAnimationController.dispose();
super.dispose();
@@ -187,7 +166,7 @@ class _SalesPageState extends State<SalesPage> with TickerProviderStateMixin {
floating: false,
pinned: true,
backgroundColor: AppColor.primary,
flexibleSpace: SalesAppbar(rotationAnimation: rotationAnimation),
flexibleSpace: CustomAppBar(title: 'Penjualan'),
),
// Date Range Header
@@ -1,96 +0,0 @@
import 'package:flutter/material.dart';
import '../../../../common/theme/theme.dart';
class SalesAppbar extends StatelessWidget {
const SalesAppbar({super.key, required this.rotationAnimation});
final Animation<double> rotationAnimation;
@override
Widget build(BuildContext context) {
return FlexibleSpaceBar(
titlePadding: const EdgeInsets.only(left: 50, bottom: 16),
title: Text(
'Penjualan',
style: AppStyle.xl.copyWith(
color: AppColor.textWhite,
fontWeight: FontWeight.w600,
),
),
background: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: AppColor.primaryGradient,
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
child: Stack(
children: [
Positioned(
right: -20,
top: -20,
child: AnimatedBuilder(
animation: rotationAnimation,
builder: (context, child) {
return Transform.rotate(
angle: rotationAnimation.value,
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.white.withOpacity(0.1),
),
),
);
},
),
),
Positioned(
left: -30,
bottom: -30,
child: AnimatedBuilder(
animation: rotationAnimation,
builder: (context, child) {
return Transform.rotate(
angle: -rotationAnimation.value * 0.5,
child: Container(
width: 80,
height: 80,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.white.withOpacity(0.05),
),
),
);
},
),
),
Positioned(
right: 80,
bottom: 30,
child: AnimatedBuilder(
animation: rotationAnimation,
builder: (context, child) {
return Transform.rotate(
angle: -rotationAnimation.value * 0.2,
child: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: AppColor.white.withOpacity(0.08),
),
),
);
},
),
),
],
),
),
);
}
}