Nova tela de login | Adaptaçao nova da AppBar | Animções novas

This commit is contained in:
Carlos Correia
2026-07-07 21:40:05 +01:00
parent a8e04ceeb2
commit 2ced93afdd
15 changed files with 1680 additions and 1322 deletions

64
lib/widgets/entrance.dart Normal file
View File

@@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
/// Animação de entrada (fade + leve deslize para cima) para dar vida a
/// cards e listas quando aparecem em ecrã. Suporta [delay] para permitir
/// efeito "staggered" (itens surgindo em sequência) em listas/grades.
class FadeSlideIn extends StatefulWidget {
const FadeSlideIn({
super.key,
required this.child,
this.delay = Duration.zero,
this.duration = const Duration(milliseconds: 420),
this.offset = const Offset(0, 0.08),
});
final Widget child;
final Duration delay;
final Duration duration;
final Offset offset;
@override
State<FadeSlideIn> createState() => _FadeSlideInState();
}
class _FadeSlideInState extends State<FadeSlideIn>
with SingleTickerProviderStateMixin {
late final AnimationController _controller = AnimationController(
vsync: this,
duration: widget.duration,
);
late final Animation<double> _fade = CurvedAnimation(
parent: _controller,
curve: Curves.easeOut,
);
late final Animation<Offset> _slide = Tween<Offset>(
begin: widget.offset,
end: Offset.zero,
).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic));
@override
void initState() {
super.initState();
if (widget.delay == Duration.zero) {
_controller.forward();
} else {
Future.delayed(widget.delay, () {
if (mounted) _controller.forward();
});
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: _fade,
child: SlideTransition(position: _slide, child: widget.child),
);
}
}