Flutter Templates
Come creare un'app per la prenotazione di eventi con Flutter e Back4App?
33 min
introduzione nel mondo frenetico di oggi, gestire eventi e prenotazioni tramite applicazioni mobili è diventato sempre più essenziale un'app per la prenotazione di eventi consente agli utenti di sfogliare gli eventi in arrivo, prenotare biglietti, selezionare posti e gestire le proprie prenotazioni senza problemi in questo tutorial, imparerai come creare un'app completa per la prenotazione di eventi utilizzando flutter per il frontend e back4app come servizio backend alla fine di questo tutorial, avrai costruito un'app funzionale che mostra un elenco di eventi con dettagli consente agli utenti di visualizzare gli orari degli eventi e le informazioni sui luoghi abilita la prenotazione dei biglietti con selezione dei posti elabora i pagamenti in modo sicuro (integrazione con un gateway di pagamento) gestisce i profili degli utenti, inclusa la cronologia delle prenotazioni e le preferenze iniziamo! prerequisiti per completare questo tutorial, avrai bisogno di flutter sdk installato sulla tua macchina locale segui il guida all'installazione di flutter https //flutter dev/docs/get started/install conoscenze di base di dart e flutter se sei nuovo a flutter, considera di seguire il tutorial introduttivo di flutter https //flutter dev/docs/get started/codelab un account back4app registrati per un account gratuito su back4app https //www back4app com/ back4app flutter sdk integrato nel tuo progetto puoi imparare come configurarlo seguendo la guida di back4app flutter https //www back4app com/docs/flutter/parse sdk/flutter setup un editor di codice come visual studio code o android studio node js e npm installati per eseguire le funzioni cloud di back4app installali dal sito ufficiale di node js https //nodejs org/ passo 1 – configurazione del backend di back4app in questo passo, configurerai il tuo progetto back4app, creerai le classi necessarie (tabelle) e configurerai il backend per memorizzare i dati degli eventi, le informazioni sui biglietti e i profili degli utenti 1 1 crea una nuova applicazione back4app accedi al tuo account back4app clicca su "crea nuova app" inserisci un nome app (ad esempio, "eventbookingapp") e seleziona la tua icona app clicca "crea" 1 2 configura le chiavi dell'applicazione naviga al dashboard della tua app clicca su "impostazioni app" > "sicurezza e chiavi" annota il id applicazione e il client key avrai bisogno di questi per inizializzare il parse sdk nella tua app flutter 1 3 definire i modelli di dati è necessario creare le seguenti classi in back4app evento memorizza i dettagli dell'evento luogo memorizza le informazioni sul luogo biglietto gestisce la disponibilità e le prenotazioni dei biglietti utente gestisce i profili utente (classe predefinita) crea la classe evento nella barra laterale sinistra, fai clic su "database" per aprire il data browser fai clic su "crea una classe" seleziona "personalizzato" , inserisci "evento" come nome della classe e fai clic su "crea classe" aggiungi le seguenti colonne alla classe evento nome (stringa) descrizione (stringa) data (data) immagine (file) luogo (puntatore a luogo) prezzo (numero) crea la classe ticket crea una nuova classe chiamata "ticket" aggiungi le seguenti colonne evento (puntatore all'evento) utente (puntatore all'utente) numeroposto (stringa) prezzo (numero) èprenotato (booleano) 1 4 abilita l'autenticazione dell'utente nella barra laterale sinistra, fai clic su "impostazioni del server" > "impostazioni generali" sotto "autenticazione" , assicurati che "abilita permessi a livello di classe" sia selezionato configura i permessi della classe utente per consentire agli utenti di registrarsi e accedere 1 5 configura le funzioni cloud (opzionale per l'elaborazione dei pagamenti) per l'integrazione dei pagamenti, potrebbe essere necessario scrivere funzioni cloud questo passaggio dipenderà dal gateway di pagamento che scegli (ad es stripe, paypal) consulta la documentazione di back4app su funzioni di codice cloud https //www back4app com/docs/platform/parse cloudcode passo 2 – inizializzazione del progetto flutter in questo passo, configurerai il progetto flutter e integrerai il back4app parse sdk 2 1 crea un nuovo progetto flutter apri il tuo terminale e esegui flutter create event booking app naviga nella directory del progetto cd event booking app 2 2 aggiungi dipendenze apri pubspec yaml e aggiungi le seguenti dipendenze 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 esegui flutter pub get per installare i pacchetti 2 3 inizializza parse sdk in lib/main dart , importa i pacchetti necessari e inizializza 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 } sostituisci 'your back4app application id' e 'your back4app client key' con le tue chiavi effettive di back4app passo 3 – implementazione dell'autenticazione utente gli utenti devono registrarsi e accedere per prenotare eventi e gestire i propri profili 3 1 crea schermate di autenticazione crea due nuovi file dart in lib/ login screen dart signup screen dart login screen 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 } } signup screen 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 aggiorna main dart con le rotte 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 2 aggiorna main dart con le rotte 3 3 implementare la schermata principale crea un home screen dart file dove gli utenti autenticati vengono reindirizzati import 'package\ flutter/material dart'; class homescreen extends statelesswidget { @override widget build(buildcontext context) { // build your home screen ui here } } passo 4 – visualizzazione degli eventi recupera gli eventi da back4app e visualizzali in un elenco 4 1 crea il modello di evento crea una classe dart event dart in 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 recupera eventi nella schermata principale in home screen dart , recupera eventi e visualizzali 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 crea schermata dettagli evento crea 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'), ), ], ), ); } } passo 5 – implementazione della selezione dei posti consenti agli utenti di selezionare i posti prima della prenotazione 5 1 crea schermata di selezione dei posti crea 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)), ), ); }, ), ); } } passo 6 – elaborazione dei pagamenti integra un gateway di pagamento per elaborare i pagamenti dei biglietti in modo sicuro 6 1 scegli un gateway di pagamento per questo tutorial, presumeremo l'uso di stripe https //stripe com/docs/payments 6 2 configura l'account stripe e ottieni le chiavi api registrati per un account stripe https //dashboard stripe com/register ottieni la tua chiave pubblicabile e chiave segreta 6 3 aggiungi la dipendenza di stripe aggiungi stripe payment pacchetto al tuo pubspec yaml dependencies stripe payment ^1 0 9 esegui flutter pub get 6 4 implementare la schermata di pagamento crea 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 l'elaborazione dei pagamenti richiede una gestione sicura dei dati sensibili in un'app di produzione, dovresti elaborare i pagamenti in modo sicuro utilizzando il tuo server o funzioni cloud passo 7 – gestire i profili utente consenti agli utenti di visualizzare e gestire le loro prenotazioni e preferenze 7 1 crea schermata profilo crea 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 aggiungi navigazione alla schermata profilo nel tuo home screen dart o nel menu di navigazione principale, aggiungi un link alla schermata profilo iconbutton( icon icon(icons person), onpressed () { navigator push( context, materialpageroute(builder (context) => profilescreen()), ); }, ), passo 8 – testare l'app esegui la tua app usando flutter run testa le seguenti funzionalità registrati e accedi visualizza l'elenco degli eventi visualizza i dettagli dell'evento seleziona i posti e procedi al pagamento elabora un pagamento (modalità di test se possibile) visualizza le prenotazioni nel profilo conclusione congratulazioni! hai costruito un'app completa per la prenotazione di eventi utilizzando flutter e back4app questa app consente agli utenti di sfogliare eventi, prenotare biglietti con selezione dei posti, elaborare pagamenti e gestire i propri profili e prenotazioni da qui, puoi migliorare la tua app aggiungendo notifiche push per i promemoria degli eventi implementando la ricerca e il filtraggio per gli eventi migliorando l'interfaccia utente/esperienza utente con un design e animazioni migliori garantendo l'elaborazione dei pagamenti con validazione lato server per ulteriori informazioni sulle funzionalità di flutter e back4app, controlla documentazione di flutter https //flutter dev/docs documentazione di back4app https //www back4app com/docs guida al cloud code di parse server https //docs parseplatform org/cloudcode/guide/ integrando flutter con back4app, sfrutti una combinazione potente per costruire applicazioni mobili scalabili e ricche di funzionalità in modo efficiente