proxybuy-flutter/lib/widgets/theme_transition_overlay.dart

126 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:lba/res/colors.dart';
class ThemeTransitionOverlay extends StatefulWidget {
final Widget child;
final bool isTransitioning;
final bool isDarkMode;
const ThemeTransitionOverlay({
super.key,
required this.child,
required this.isTransitioning,
required this.isDarkMode,
});
@override
State<ThemeTransitionOverlay> createState() => _ThemeTransitionOverlayState();
}
class _ThemeTransitionOverlayState extends State<ThemeTransitionOverlay>
with TickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _scaleAnimation;
late Animation<double> _fadeAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 800),
vsync: this,
);
_scaleAnimation = Tween<double>(
begin: 0.0,
end: 3.0,
).animate(CurvedAnimation(
parent: _controller,
curve: const Interval(0.0, 0.7, curve: Curves.easeOutCubic),
));
_fadeAnimation = Tween<double>(
begin: 1.0,
end: 0.0,
).animate(CurvedAnimation(
parent: _controller,
curve: const Interval(0.6, 1.0, curve: Curves.easeInCubic),
));
}
@override
void didUpdateWidget(ThemeTransitionOverlay oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.isTransitioning && !oldWidget.isTransitioning) {
_controller.forward().then((_) {
_controller.reset();
});
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
widget.child,
if (widget.isTransitioning)
AnimatedBuilder(
animation: _controller,
builder: (context, child) {
return Positioned.fill(
child: Container(
color: Colors.transparent,
child: Center(
child: Transform.scale(
scale: _scaleAnimation.value,
child: Opacity(
opacity: _fadeAnimation.value,
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: RadialGradient(
colors: widget.isDarkMode
? [
DarkAppColors.scaffoldBackground,
DarkAppColors.surface,
DarkAppColors.primary,
]
: [
LightAppColors.scaffoldBackground,
LightAppColors.surface,
LightAppColors.primary,
],
stops: const [0.3, 0.7, 1.0],
),
boxShadow: [
BoxShadow(
color: (widget.isDarkMode
? DarkAppColors.primary
: LightAppColors.primary)
.withOpacity(0.3),
blurRadius: 30,
spreadRadius: 10,
),
],
),
),
),
),
),
),
);
},
),
],
);
}
}