0% encontró este documento útil (0 votos)
23 vistas6 páginas

Gestión de Estudiantes con Firebase

Este documento es un código fuente en Flutter que implementa una aplicación para gestionar estudiantes utilizando Firebase Firestore. Incluye funcionalidades para agregar, actualizar y mostrar una lista de estudiantes, así como un sistema de manejo de errores. La interfaz de usuario está diseñada con Material Design y permite la edición de datos de los estudiantes a través de cuadros de diálogo.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
23 vistas6 páginas

Gestión de Estudiantes con Firebase

Este documento es un código fuente en Flutter que implementa una aplicación para gestionar estudiantes utilizando Firebase Firestore. Incluye funcionalidades para agregar, actualizar y mostrar una lista de estudiantes, así como un sistema de manejo de errores. La interfaz de usuario está diseñada con Material Design y permite la edición de datos de los estudiantes a través de cuadros de diálogo.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

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
);
}
}

También podría gustarte