stats page pagina melhrar
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user