stats page pagina melhrar

This commit is contained in:
2026-01-20 17:15:29 +00:00
parent 01d5e7adb6
commit 05c4738ef2
23 changed files with 883 additions and 573 deletions

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import '../Controllers/register_controller.dart';
import '../controllers/register_controller.dart'; // Garante que o caminho está certo
class RegisterHeader extends StatelessWidget {
const RegisterHeader({super.key});
@@ -8,7 +8,6 @@ class RegisterHeader extends StatelessWidget {
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
// Mesma lógica de tamanhos do Login
final logoSize = screenWidth > 600 ? 150.0 : 100.0;
final titleFontSize = screenWidth > 600 ? 48.0 : 36.0;
final subtitleFontSize = screenWidth > 600 ? 22.0 : 18.0;
@@ -46,7 +45,6 @@ class RegisterHeader extends StatelessWidget {
class RegisterFormFields extends StatefulWidget {
final RegisterController controller;
const RegisterFormFields({super.key, required this.controller});
@@ -60,75 +58,88 @@ class _RegisterFormFieldsState extends State<RegisterFormFields> {
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
// Padding vertical idêntico ao login
final verticalPadding = screenWidth > 600 ? 22.0 : 16.0;
return Column(
children: [
TextField(
controller: widget.controller.emailController,
decoration: InputDecoration(
labelText: 'E-mail',
prefixIcon: const Icon(Icons.email_outlined),
// O erro agora vem diretamente do controller
errorText: widget.controller.emailError,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
keyboardType: TextInputType.emailAddress,
),
const SizedBox(height: 20),
// Campo Password
TextField(
controller: widget.controller.passwordController,
obscureText: _obscurePassword,
decoration: InputDecoration(
labelText: 'Palavra-passe',
prefixIcon: const Icon(Icons.lock_outlined),
errorText: widget.controller.passwordError,
suffixIcon: IconButton(
icon: Icon(_obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined),
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
// IMPORTANTE: Envolvemos tudo num Form usando a chave do controller
return Form(
key: widget.controller.formKey,
child: Column(
children: [
// Campo Nome (Opcional, mas útil)
TextFormField(
controller: widget.controller.nameController,
decoration: InputDecoration(
labelText: 'Nome Completo',
prefixIcon: const Icon(Icons.person_outline),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
),
const SizedBox(height: 20),
const SizedBox(height: 20),
// Campo Confirmar Password
TextField(
controller: widget.controller.confirmPasswordController,
obscureText: _obscurePassword,
decoration: InputDecoration(
labelText: 'Confirmar Palavra-passe',
prefixIcon: const Icon(Icons.lock_clock_outlined),
errorText: widget.controller.confirmPasswordError,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
// Campo Email
TextFormField(
controller: widget.controller.emailController,
// Validação automática ligada ao controller
validator: widget.controller.validateEmail,
decoration: InputDecoration(
labelText: 'E-mail',
prefixIcon: const Icon(Icons.email_outlined),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
keyboardType: TextInputType.emailAddress,
),
),
],
const SizedBox(height: 20),
// Campo Password
TextFormField(
controller: widget.controller.passwordController,
obscureText: _obscurePassword,
validator: widget.controller.validatePassword,
decoration: InputDecoration(
labelText: 'Palavra-passe',
prefixIcon: const Icon(Icons.lock_outlined),
suffixIcon: IconButton(
icon: Icon(_obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined),
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
),
const SizedBox(height: 20),
// Campo Confirmar Password
TextFormField(
controller: widget.controller.confirmPasswordController,
obscureText: _obscurePassword,
validator: widget.controller.validateConfirmPassword,
decoration: InputDecoration(
labelText: 'Confirmar Palavra-passe',
prefixIcon: const Icon(Icons.lock_clock_outlined),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
),
],
),
);
}
}
class RegisterButton extends StatelessWidget {
final RegisterController controller;
final VoidCallback onRegisterSuccess;
const RegisterButton({
super.key,
required this.controller,
required this.onRegisterSuccess,
});
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
// Mesmos tamanhos exatos do LoginButton
final buttonHeight = screenWidth > 600 ? 70.0 : 58.0;
final fontSize = screenWidth > 600 ? 22.0 : 18.0;
@@ -136,12 +147,8 @@ class RegisterButton extends StatelessWidget {
width: double.infinity,
height: buttonHeight,
child: ElevatedButton(
onPressed: controller.isLoading ? null : () async {
final success = await controller.signUp();
if (success) {
onRegisterSuccess();
}
},
// Passamos o context para o controller lidar com as SnackBars e Navegação
onPressed: controller.isLoading ? null : () => controller.signUp(context),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFFE74C3C),
foregroundColor: Colors.white,