fix login con database

This commit is contained in:
25030248hasel
2026-05-23 06:52:42 -06:00
parent 1709a51ecc
commit 7d07cc101d
2 changed files with 91 additions and 23 deletions

View File

@@ -1,11 +1,12 @@
import 'home_screen_placeholder.dart'; // 📍 Ajusta las carpetas '../' según la ubicación exacta en tu proyecto
import '../../../../core/network/mysql_service.dart'; // 📍 Ajusta las carpetas '../' según tu proyecto
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import '../../../../core/router/app_router.dart'; // 📍 Importación de rutas verificada
import '../../../../core/router/app_router.dart';
import '../../../../core/theme/app_theme.dart';
import '../bloc/auth_bloc.dart';
import '../bloc/auth_event.dart';
import '../bloc/auth_state.dart';
import '../widgets/privacy_notice_card.dart';
@@ -19,8 +20,10 @@ class LoginScreen extends StatefulWidget {
class _LoginScreenState extends State<LoginScreen>
with SingleTickerProviderStateMixin {
final _formKey = GlobalKey<FormState>();
final _identifierController = TextEditingController();
final _passwordController = TextEditingController();
final _identifierController =
TextEditingController(); // Controlador para el correo
final _passwordController =
TextEditingController(); // Controlador para la contraseña
bool _obscurePassword = true;
@@ -50,14 +53,76 @@ class _LoginScreenState extends State<LoginScreen>
super.dispose();
}
void _submit(BuildContext context) {
// 📍 CONSULTA REAL SELECT A TU TABLA DE MYSQL
void _submit(BuildContext context) async {
if (_formKey.currentState?.validate() ?? false) {
context.read<AuthBloc>().add(
AuthLoginRequested(
identifier: _identifierController.text.trim(),
password: _passwordController.text,
),
try {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Validando credenciales en MySQL Celaya...')),
);
// 1. Obtener la conexión por el cable USB Mapped
final conn = await MySqlService().getConnection();
// 2. Ejecutar la búsqueda con los nombres exactos de tus columnas
// 2. Modificamos el SELECT para buscar SOLO por email
final result = await conn.execute(
"SELECT email, contrasena_hash, rol FROM usuarios WHERE email = :email",
{
"email": _identifierController.text.trim(),
},
);
if (!mounted) return;
if (result.rows.isNotEmpty) {
final usuarioEncontrado = result.rows.first.assoc();
final contrasenaEnBd = usuarioEncontrado['contrasena_hash'];
final email = usuarioEncontrado['email'];
final rol = usuarioEncontrado['rol'];
// 3. Validamos la contraseña directamente en Flutter comparando textos limpios
if (contrasenaEnBd?.trim() == _passwordController.text.trim()) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("¡Bienvenido de nuevo, $email ($rol)!")),
);
// 📍 CORRECCIÓN DEFINITIVA: Usamos GoRouter nativo en lugar de Navigator
// Esto elimina por completo el conflicto de aserción en el árbol de widgets
context.go('/home?colonia=Centro');
} else {
// Contraseña mal mapeada en la BD
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Contraseña incorrecta para este usuario'),
backgroundColor: Colors.orange),
);
}
} else {
// El correo de plano no existe en MySQL Workbench
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('El correo electrónico no está registrado'),
backgroundColor: Colors.orange),
);
}
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Error al conectar con MySQL: $e"), // 📍 CORREGIDO: Sin contra-barra para que pinte el error real
backgroundColor: Colors.red,
duration: const Duration(seconds: 5),
),
);
}
}
}
@@ -135,15 +200,11 @@ class _LoginScreenState extends State<LoginScreen>
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text(
'Bienvenido a WasteNotify',
style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold),
),
Text('Bienvenido a WasteNotify',
style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold)),
SizedBox(height: 8),
Text(
'Inicia sesión para continuar',
style: TextStyle(fontSize: 14, color: Colors.grey),
),
Text('Inicia sesión para continuar',
style: TextStyle(fontSize: 14, color: Colors.grey)),
],
);
}
@@ -256,4 +317,4 @@ class _LoginScreenState extends State<LoginScreen>
// Placeholders para evitar errores si no están definidos
Widget _buildDemoHint() => const SizedBox.shrink();
} // 📍
} // 📍 Cierre de la clase _LoginScreenState