146 lines
5.8 KiB
Dart
146 lines
5.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../widgets/entrance.dart';
|
|
import '../widgets/liquid_waves_background.dart';
|
|
import '../widgets/tap_bounce.dart';
|
|
|
|
const Color _pink = Color(0xFFFF55A7);
|
|
const Color _teal = Color(0xFF2F9E94);
|
|
|
|
/// Ecrã intersticial informativo, mostrado a meio do quiz para preparar o
|
|
/// utilizador antes de continuar (ex.: logo a seguir a um vídeo-guia) —
|
|
/// um ícone, um título e uma lista de pontos com visto.
|
|
class QuizChecklistScreen extends StatelessWidget {
|
|
const QuizChecklistScreen({
|
|
super.key,
|
|
required this.heading,
|
|
required this.items,
|
|
required this.onAdvance,
|
|
this.icon = Icons.health_and_safety_rounded,
|
|
});
|
|
|
|
final String heading;
|
|
final List<String> items;
|
|
final void Function(BuildContext context) onAdvance;
|
|
final IconData icon;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: Stack(
|
|
clipBehavior: Clip.none,
|
|
children: [
|
|
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
|
|
const LiquidWavesBackground(),
|
|
SafeArea(
|
|
child: Padding(
|
|
padding: const EdgeInsets.fromLTRB(24, 24, 24, 24),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
Expanded(
|
|
child: Center(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
FadeSlideIn(
|
|
child: Container(
|
|
width: 76,
|
|
height: 76,
|
|
decoration: BoxDecoration(
|
|
color: _teal.withValues(alpha: 0.12),
|
|
shape: BoxShape.circle,
|
|
),
|
|
child: Icon(icon, color: _teal, size: 36),
|
|
),
|
|
),
|
|
const SizedBox(height: 22),
|
|
FadeSlideIn(
|
|
delay: const Duration(milliseconds: 60),
|
|
child: Text(
|
|
heading,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.w900,
|
|
color: Colors.black87,
|
|
height: 1.25,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(height: 22),
|
|
for (var i = 0; i < items.length; i++) ...[
|
|
if (i > 0) const SizedBox(height: 14),
|
|
FadeSlideIn(
|
|
delay: Duration(milliseconds: 100 + 40 * i),
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Container(
|
|
width: 22,
|
|
height: 22,
|
|
margin: const EdgeInsets.only(top: 1),
|
|
decoration: const BoxDecoration(
|
|
color: _teal,
|
|
shape: BoxShape.circle,
|
|
),
|
|
child: const Icon(
|
|
Icons.check_rounded,
|
|
size: 15,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
const SizedBox(width: 12),
|
|
Expanded(
|
|
child: Text(
|
|
items[i],
|
|
style: TextStyle(
|
|
fontSize: 14.5,
|
|
fontWeight: FontWeight.w700,
|
|
color: Colors.black.withValues(
|
|
alpha: 0.75,
|
|
),
|
|
height: 1.35,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
),
|
|
),
|
|
FadeSlideIn(
|
|
delay: const Duration(milliseconds: 260),
|
|
child: TapBounce(
|
|
child: SizedBox(
|
|
width: double.infinity,
|
|
height: 52,
|
|
child: FilledButton(
|
|
style: FilledButton.styleFrom(
|
|
backgroundColor: _pink,
|
|
foregroundColor: Colors.white,
|
|
shape: const StadiumBorder(),
|
|
textStyle: const TextStyle(
|
|
fontWeight: FontWeight.w800,
|
|
fontSize: 16,
|
|
),
|
|
),
|
|
onPressed: () => onAdvance(context),
|
|
child: const Text('Avançar'),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|