Flutter Templates
Cómo construir una aplicación de reserva de eventos con Flutter y Back4App
34 min
introducción en el mundo acelerado de hoy, gestionar eventos y reservas a través de aplicaciones móviles se ha vuelto cada vez más esencial una aplicación de reserva de eventos permite a los usuarios explorar eventos próximos, reservar entradas, seleccionar asientos y gestionar sus reservas sin problemas en este tutorial, aprenderás a crear una aplicación completa de reserva de eventos utilizando flutter para el frontend y back4app como el servicio backend al final de este tutorial, habrás construido una aplicación funcional que muestra una lista de eventos con detalles permite a los usuarios ver horarios de eventos e información sobre el lugar permite la reserva de entradas con selección de asientos procesa pagos de forma segura (integración con una pasarela de pago) gestiona perfiles de usuario, incluyendo historial de reservas y preferencias ¡comencemos! requisitos previos para completar este tutorial, necesitarás flutter sdk instalado en tu máquina local sigue la guía de instalación de flutter https //flutter dev/docs/get started/install conocimientos básicos de dart y flutter si eres nuevo en flutter, considera seguir el tutorial introductorio de flutter https //flutter dev/docs/get started/codelab una cuenta de back4app regístrate para obtener una cuenta gratuita en back4app https //www back4app com/ back4app flutter sdk integrado en tu proyecto puedes aprender a configurarlo siguiendo la guía de back4app flutter https //www back4app com/docs/flutter/parse sdk/flutter setup un editor de código como visual studio code o android studio node js y npm instalados para ejecutar funciones en la nube de back4app instálalos desde el sitio web oficial de node js https //nodejs org/ paso 1 – configuración del backend de back4app en este paso, configurarás tu proyecto de back4app, crearás las clases necesarias (tablas) y configurarás el backend para almacenar datos de eventos, información de boletos y perfiles de usuario 1 1 crear una nueva aplicación en back4app inicie sesión en su cuenta de back4app haga clic en "crear nueva app" ingrese un nombre de la app (por ejemplo, "eventbookingapp") y seleccione su ícono de la app haga clic en "crear" 1 2 configurar claves de aplicación navegue a su tablero de la app haga clic en "configuración de la app" > "seguridad y claves" anote el id de aplicación y clave de cliente necesitará estos para inicializar el sdk de parse en su app de flutter 1 3 define los modelos de datos necesitas crear las siguientes clases en back4app evento almacena detalles del evento lugar almacena información del lugar boleto gestiona la disponibilidad y reservas de boletos usuario gestiona los perfiles de usuario (clase predeterminada) crea la clase evento en la barra lateral izquierda, haga clic en "base de datos" para abrir el navegador de datos haga clic en "crear una clase" seleccione "personalizado" , ingrese "evento" como el nombre de la clase, y haga clic en "crear clase" agregue las siguientes columnas a la clase evento nombre (cadena) descripción (cadena) fecha (fecha) imagen (archivo) lugar (puntero a lugar) precio (número) crear la clase de lugar repita los pasos para crear una nueva clase llamada "lugar" agregue las siguientes columnas nombre (cadena) dirección (cadena) capacidad (número) plandeasientos (archivo) crear la clase ticket crear una nueva clase llamada "ticket" agregar las siguientes columnas evento (puntero a evento) usuario (puntero a usuario) númerodeasiento (cadena) precio (número) estáreservado (booleano) 1 4 habilitar la autenticación de usuario en la barra lateral izquierda, haga clic en "configuraciones del servidor" > "configuraciones generales" bajo "autenticación" , asegúrese de que "habilitar permisos a nivel de clase" esté marcado configurar los permisos de la clase usuario para permitir que los usuarios se registren e inicien sesión 1 5 configurar funciones en la nube (opcional para procesamiento de pagos) para la integración de pagos, es posible que necesite escribir funciones en la nube este paso dependerá de la pasarela de pago que elija (por ejemplo, stripe, paypal) consulte la documentación de back4app sobre funciones de código en la nube https //www back4app com/docs/platform/parse cloudcode paso 2 – inicializando el proyecto flutter en este paso, configurarás el proyecto flutter e integrarás el sdk de back4app parse 2 1 crear un nuevo proyecto flutter abre tu terminal y ejecuta flutter create event booking app navega al directorio del proyecto cd event booking app 2 2 agregar dependencias abre pubspec yaml y agrega las siguientes dependencias dependencies flutter sdk flutter cupertino icons ^1 0 2 parse server sdk flutter ^4 0 1 provider ^6 0 0 \# add any additional packages you need, e g , http, image picker, etc ejecuta flutter pub get para instalar los paquetes 2 3 inicializar el sdk de parse en lib/main dart , importa los paquetes necesarios e inicializa parse import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; void main() async { widgetsflutterbinding ensureinitialized(); const keyapplicationid = 'your back4app application id'; const keyclientkey = 'your back4app client key'; const keyparseserverurl = 'https //parseapi back4app com'; await parse() initialize( keyapplicationid, keyparseserverurl, clientkey keyclientkey, debug true, autosendsessionid true, ); runapp(myapp()); } class myapp extends statelesswidget { // build your app's ui here } reemplace 'your back4app application id' y 'your back4app client key' con sus claves reales de back4app paso 3 – implementación de la autenticación de usuarios los usuarios necesitan registrarse e iniciar sesión para reservar eventos y gestionar sus perfiles 3 1 crear pantallas de autenticación cree dos nuevos archivos dart en lib/ login screen dart signup screen dart pantalla de login dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class loginscreen extends statefulwidget { @override loginscreenstate createstate() => loginscreenstate(); } class loginscreenstate extends state\<loginscreen> { final texteditingcontroller usernamecontroller = texteditingcontroller(); final texteditingcontroller passwordcontroller = texteditingcontroller(); void douserlogin() async { final username = usernamecontroller text trim(); final password = passwordcontroller text trim(); final user = parseuser(username, password, null); var response = await user login(); if (response success) { // navigate to home screen navigator pushreplacementnamed(context, '/home'); } else { // show error message showerror(response error! message); } } void showerror(string message) { // implement a method to show error messages } @override widget build(buildcontext context) { // build your login ui here } } pantalla de registro dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class signupscreen extends statefulwidget { @override signupscreenstate createstate() => signupscreenstate(); } class signupscreenstate extends state\<signupscreen> { final texteditingcontroller usernamecontroller = texteditingcontroller(); final texteditingcontroller passwordcontroller = texteditingcontroller(); void douserregistration() async { final username = usernamecontroller text trim(); final password = passwordcontroller text trim(); final user = parseuser(username, password, null); var response = await user signup(); if (response success) { // navigate to home screen navigator pushreplacementnamed(context, '/home'); } else { // show error message showerror(response error! message); } } void showerror(string message) { // implement a method to show error messages } @override widget build(buildcontext context) { // build your sign up ui here } } 3 2 actualizar main dart con rutas class myapp extends statelesswidget { @override widget build(buildcontext context) { return materialapp( title 'event booking app', initialroute '/login', routes { '/login' (context) => loginscreen(), '/signup' (context) => signupscreen(), '/home' (context) => homescreen(), // add other routes as needed }, ); } } 3 3 implementar pantalla de inicio crea un home screen dart archivo donde los usuarios autenticados son redirigidos import 'package\ flutter/material dart'; class homescreen extends statelesswidget { @override widget build(buildcontext context) { // build your home screen ui here } } paso 4 – mostrando eventos obtén eventos de back4app y muéstralos en una lista 4 1 crear modelo de evento crea una clase dart event dart en lib/models/ import 'package\ parse server sdk flutter/parse server sdk dart'; class event extends parseobject implements parsecloneable { event() super( keytablename); event clone() this(); static const string keytablename = 'event'; static const string keyname = 'name'; static const string keydescription = 'description'; static const string keydate = 'date'; static const string keyimage = 'image'; static const string keyvenue = 'venue'; static const string keyprice = 'price'; @override clone(map\<string, dynamic> map) => event clone() fromjson(map); string? get name => get\<string>(keyname); string? get description => get\<string>(keydescription); datetime? get date => get\<datetime>(keydate); parsefilebase? get image => get\<parsefilebase>(keyimage); parseobject? get venue => get\<parseobject>(keyvenue); double? get price => get\<double>(keyprice); } 4 2 obtener eventos en la pantalla de inicio en home screen dart , obtén eventos y muéstralos import 'package\ flutter/material dart'; import 'models/event dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class homescreen extends statefulwidget { @override homescreenstate createstate() => homescreenstate(); } class homescreenstate extends state\<homescreen> { future\<list\<event>> getevents() async { querybuilder\<event> queryevents = querybuilder\<event>(event()) orderbydescending('date'); final parseresponse apiresponse = await queryevents query(); if (apiresponse success && apiresponse results != null) { return apiresponse results as list\<event>; } else { return \[]; } } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('events'), ), body futurebuilder\<list\<event>>( future getevents(), builder (context, snapshot) { if (snapshot hasdata) { list\<event> events = snapshot data!; return listview\ builder( itemcount events length, itembuilder (context, index) { event event = events\[index]; return listtile( title text(event name ?? 'no title'), subtitle text(event date? tolocal() tostring() ?? ''), ontap () { // navigate to event details navigator push( context, materialpageroute( builder (context) => eventdetailsscreen(event event), ), ); }, ); }, ); } else if (snapshot haserror) { return center(child text('error loading events')); } else { return center(child circularprogressindicator()); } }, ), ); } } 4 3 crear pantalla de detalles del evento crear event details screen dart import 'package\ flutter/material dart'; import 'models/event dart'; class eventdetailsscreen extends statelesswidget { final event event; eventdetailsscreen({required this event}); void bookticket(buildcontext context) { // implement ticket booking logic navigator push( context, materialpageroute( builder (context) => seatselectionscreen(event event), ), ); } @override widget build(buildcontext context) { // build ui to display event details return scaffold( appbar appbar( title text(event name ?? 'event details'), ), body column( children \[ // display event image, description, date, venue, etc text(event description ?? ''), elevatedbutton( onpressed () => bookticket(context), child text('book ticket'), ), ], ), ); } } paso 5 – implementación de la selección de asientos permitir a los usuarios seleccionar asientos antes de reservar 5 1 crear pantalla de selección de asientos crear seat selection screen dart import 'package\ flutter/material dart'; import 'models/event dart'; class seatselectionscreen extends statelesswidget { final event event; seatselectionscreen({required this event}); // mock data for seats final list\<string> seats = list generate(100, (index) => 'seat ${index + 1}'); @override widget build(buildcontext context) { // build ui for seat selection return scaffold( appbar appbar( title text('select seats'), ), body gridview\ builder( griddelegate slivergriddelegatewithfixedcrossaxiscount( crossaxiscount 5, ), itemcount seats length, itembuilder (context, index) { string seat = seats\[index]; return gesturedetector( ontap () { // handle seat selection // navigate to payment screen navigator push( context, materialpageroute( builder (context) => paymentscreen(event event, seat seat), ), ); }, child card( child center(child text(seat)), ), ); }, ), ); } } paso 6 – procesamiento de pagos integrar una pasarela de pago para procesar los pagos de boletos de manera segura 6 1 elegir una pasarela de pago para este tutorial, asumiremos el uso de stripe https //stripe com/docs/payments 6 2 configurar cuenta de stripe y obtener claves api regístrate para una cuenta de stripe https //dashboard stripe com/register obtén tu clave publicable y clave secreta 6 3 agregar dependencia de stripe agrega stripe payment paquete a tu pubspec yaml dependencies stripe payment ^1 0 9 ejecutar flutter pub get 6 4 implementar pantalla de pago crear payment screen dart import 'package\ flutter/material dart'; import 'package\ stripe payment/stripe payment dart'; import 'models/event dart'; class paymentscreen extends statefulwidget { final event event; final string seat; paymentscreen({required this event, required this seat}); @override paymentscreenstate createstate() => paymentscreenstate(); } class paymentscreenstate extends state\<paymentscreen> { void initstate() { super initstate(); stripepayment setoptions( stripeoptions( publishablekey 'your stripe publishable key', // optionally set other options ), ); } void startpayment() async { // implement payment logic // create payment method paymentmethod paymentmethod = await stripepayment paymentrequestwithcardform( cardformpaymentrequest(), ); // process the payment using a cloud function or your server // for simplicity, we'll assume payment is successful saveticket(); } void saveticket() async { // save ticket information to back4app final ticket = parseobject('ticket') set('event', widget event) set('user', await parseuser currentuser()) set('seatnumber', widget seat) set('price', widget event price) set('isbooked', true); await ticket save(); // navigate to confirmation screen or display success message } @override widget build(buildcontext context) { // build payment ui return scaffold( appbar appbar( title text('payment'), ), body center( child elevatedbutton( onpressed startpayment, child text('pay \\$${widget event price}'), ), ), ); } } nota el procesamiento de pagos requiere un manejo seguro de datos sensibles en una aplicación de producción, debes procesar los pagos de manera segura utilizando tu propio servidor o funciones en la nube paso 7 – gestionando perfiles de usuario permitir a los usuarios ver y gestionar sus reservas y preferencias 7 1 crear pantalla de perfil crear profile screen dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class profilescreen extends statelesswidget { future\<list\<parseobject>> getusertickets() async { final user = await parseuser currentuser(); querybuilder\<parseobject> querytickets = querybuilder\<parseobject>(parseobject('ticket')) whereequalto('user', user) includeobject(\['event']); final parseresponse apiresponse = await querytickets query(); if (apiresponse success && apiresponse results != null) { return apiresponse results as list\<parseobject>; } else { return \[]; } } @override widget build(buildcontext context) { // build profile ui return scaffold( appbar appbar( title text('my profile'), ), body futurebuilder\<list\<parseobject>>( future getusertickets(), builder (context, snapshot) { if (snapshot hasdata) { list\<parseobject> tickets = snapshot data!; return listview\ builder( itemcount tickets length, itembuilder (context, index) { parseobject ticket = tickets\[index]; parseobject event = ticket get('event'); return listtile( title text(event get\<string>('name') ?? 'no event name'), subtitle text('seat ${ticket get\<string>('seatnumber')}'), ); }, ); } else if (snapshot haserror) { return center(child text('error loading tickets')); } else { return center(child circularprogressindicator()); } }, ), ); } } 7 2 agregar navegación a la pantalla de perfil en tu home screen dart o en el menú de navegación principal, agrega un enlace a la pantalla de perfil iconbutton( icon icon(icons person), onpressed () { navigator push( context, materialpageroute(builder (context) => profilescreen()), ); }, ), paso 8 – probando la aplicación ejecuta tu aplicación usando flutter run prueba las siguientes funcionalidades registrarse e iniciar sesión ver la lista de eventos ver detalles del evento seleccionar asientos y proceder al pago procesar un pago (modo de prueba si es posible) ver reservas en el perfil conclusión ¡felicidades! has construido una aplicación completa de reserva de eventos utilizando flutter y back4app esta aplicación permite a los usuarios explorar eventos, reservar entradas con selección de asientos, procesar pagos y gestionar sus perfiles y reservas a partir de aquí, puedes mejorar tu aplicación añadiendo notificaciones push para recordatorios de eventos implementando búsqueda y filtrado para eventos mejorando la ui/ux con un mejor diseño y animaciones asegurando el procesamiento de pagos con validación del lado del servidor para más información sobre las características de flutter y back4app, consulta documentación de flutter https //flutter dev/docs documentación de back4app https //www back4app com/docs guía de cloud code de parse server https //docs parseplatform org/cloudcode/guide/ al integrar flutter con back4app, aprovechas una combinación poderosa para construir aplicaciones móviles escalables y ricas en características de manera eficiente