import 'package:cloud_firestore/cloud_firestore.
dart';
import 'package:conexion_firebase/firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/[Link]';
void main() async {
[Link]();
await [Link](
options: [Link],
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({[Link]});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Firebase Demo',
theme: ThemeData(
primarySwatch: [Link],
visualDensity: [Link],
),
home: const MyHomePage(title: 'Firebase Firestore'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({[Link], required [Link]});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final FirebaseFirestore db = [Link];
final CollectionReference students =
[Link]('estudiantes');
List<Map<String, dynamic>> _studentsList = []; // Lista de estudiantes
String _message = '';
@override
void initState() {
[Link]();
_fetchStudents(); // Obtener la lista de estudiantes desde Firebase
}
// Método para obtener la lista de estudiantes
Future<void> _fetchStudents() async {
try {
final QuerySnapshot snapshot = await [Link]();
final List<Map<String, dynamic>> fetchedStudents = [Link]((doc) {
return {
'id': [Link],
'apellidoPaterno': doc['apellidoPaterno'],
'apellidoMaterno': doc['apellidoMaterno'],
'edad': doc['edad'],
'colorPiel': doc['colorPiel'],
'colorFav': doc['colorFav'],
'preferencias': doc['preferencias'],
};
}).toList();
setState(() {
_studentsList = fetchedStudents;
});
} catch (e) {
setState(() {
_message = 'Error al obtener los estudiantes: $e';
});
}
}
// Método para agregar un nuevo estudiante
Future<void> _addStudent() async {
try {
final newStudentId = 'estudiante${_studentsList.length + 1}'; // ID
incremental
await [Link](newStudentId).set({
'apellidoPaterno': 'Perez',
'apellidoMaterno': 'Lopez',
'edad': 20 + (_studentsList.length % 5), // Edad aleatoria
'colorPiel': 'Moreno',
'colorFav': 'Azul',
'preferencias': 'Fútbol, Videojuegos',
});
setState(() {
_message = 'Estudiante agregado con éxito!';
});
_fetchStudents(); // Actualizar la lista de estudiantes
} catch (e) {
setState(() {
_message = 'Error al agregar estudiante: $e';
});
}
}
// Método para actualizar los datos de un estudiante
Future<void> _updateStudent(String studentId, String newApellidoPaterno, String
newApellidoMaterno, int newEdad, String newColorPiel, String newColorFav, String
newPreferencias) async {
try {
await [Link](studentId).update({
'apellidoPaterno': newApellidoPaterno,
'apellidoMaterno': newApellidoMaterno,
'edad': newEdad,
'colorPiel': newColorPiel,
'colorFav': newColorFav,
'preferencias': newPreferencias,
});
setState(() {
_message = 'Estudiante actualizado con éxito!';
});
_fetchStudents(); // Actualizar la lista de estudiantes
} catch (e) {
setState(() {
_message = 'Error al actualizar estudiante: $e';
});
}
}
// Método para mostrar cuadro de edición de estudiante
void _showEditDialog(BuildContext context, Map<String, dynamic> student) {
TextEditingController apellidoPaternoController = TextEditingController(text:
student['apellidoPaterno']);
TextEditingController apellidoMaternoController = TextEditingController(text:
student['apellidoMaterno']);
TextEditingController edadController = TextEditingController(text:
student['edad'].toString());
TextEditingController colorPielController = TextEditingController(text:
student['colorPiel']);
TextEditingController colorFavController = TextEditingController(text:
student['colorFav']);
TextEditingController preferenciasController = TextEditingController(text:
student['preferencias']);
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Editar Estudiante'),
content: Column(
mainAxisSize: [Link],
children: <Widget>[
TextField(
controller: apellidoPaternoController,
decoration: InputDecoration(labelText: 'Apellido Paterno'),
),
TextField(
controller: apellidoMaternoController,
decoration: InputDecoration(labelText: 'Apellido Materno'),
),
TextField(
controller: edadController,
decoration: InputDecoration(labelText: 'Edad'),
keyboardType: [Link],
),
TextField(
controller: colorPielController,
decoration: InputDecoration(labelText: 'Color de Piel'),
),
TextField(
controller: colorFavController,
decoration: InputDecoration(labelText: 'Color Favorito'),
),
TextField(
controller: preferenciasController,
decoration: InputDecoration(labelText: 'Preferencias'),
),
],
),
actions: <Widget>[
TextButton(
onPressed: () {
// Actualizar estudiante con los nuevos valores
_updateStudent(
student['id'],
[Link],
[Link],
[Link]([Link]),
[Link],
[Link],
[Link],
);
[Link](context).pop();
},
child: Text('Actualizar'),
),
TextButton(
onPressed: () {
[Link](context).pop();
},
child: Text('Cancelar'),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text([Link]),
backgroundColor: [Link],
),
body: Padding(
padding: const [Link](16.0),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
// Título de la lista de estudiantes
Text(
'Datos de Estudiantes:',
style: TextStyle(
fontSize: 24,
fontWeight: [Link],
color: [Link][700],
),
),
const SizedBox(height: 20),
// Mensaje de estado o resultado
if (_message.isNotEmpty)
Card(
color: [Link][50],
elevation: 4.0,
shape: RoundedRectangleBorder(
borderRadius: [Link](12),
),
child: Padding(
padding: const [Link](16.0),
child: Text(
_message,
style: TextStyle(fontSize: 16, color: Colors.black87),
textAlign: [Link],
),
),
),
const SizedBox(height: 20),
// Lista de estudiantes
[Link](
shrinkWrap: true,
itemCount: _studentsList.length,
itemBuilder: (context, index) {
final student = _studentsList[index];
return Card(
elevation: 4.0,
shape: RoundedRectangleBorder(
borderRadius: [Link](12),
),
child: Padding(
padding: const [Link](16.0),
child: Row(
mainAxisAlignment: [Link],
children: <Widget>[
Text(
'${index + 1}. ${student['apellidoPaterno']} $
{student['apellidoMaterno']}',
style: TextStyle(fontSize: 16, fontWeight:
[Link]),
),
IconButton(
icon: Icon([Link]),
onPressed: () {
_showEditDialog(context, student);
},
),
],
),
),
);
},
),
const SizedBox(height: 20),
// Botón para agregar estudiante
ElevatedButton(
onPressed: _addStudent,
style: _buttonStyle(
backgroundColor: [Link], // color de fondo
foregroundColor: [Link], // color de texto
padding: const [Link](vertical: 15),
elevation: 10.0,
shape: RoundedRectangleBorder(borderRadius:
[Link](15)),
),
child: const Text('Agregar Estudiante'),
),
],
),
),
),
);
}
// Función que permite crear un estilo de botón personalizado
ButtonStyle _buttonStyle({
required Color backgroundColor,
required Color foregroundColor,
required EdgeInsetsGeometry padding,
required double elevation,
required OutlinedBorder shape, // Ahora usamos 'OutlinedBorder'
}) {
return [Link](
backgroundColor: backgroundColor,
foregroundColor: foregroundColor,
padding: padding,
elevation: elevation,
shape: shape, // Forma redondeada usando RoundedRectangleBorder
);
}
}