126 lines
3.8 KiB
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,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|