Flutter Templates
How to Build an Event Booking App with Flutter and Back4App
33 min
introduction in today's fast paced world, managing events and bookings through mobile applications has become increasingly essential an event booking app allows users to browse upcoming events, book tickets, select seats, and manage their bookings seamlessly in this tutorial, you will learn how to create a complete event booking app using flutter for the frontend and back4app as the backend service by the end of this tutorial, you will have built a functional app that displays a list of events with details allows users to view event schedules and venue information enables ticket booking with seat selection processes payments securely (integration with a payment gateway) manages user profiles, including booking history and preferences let's get started! prerequisites to complete this tutorial, you will need flutter sdk installed on your local machine follow the official flutter installation guide https //flutter dev/docs/get started/install basic knowledge of dart and flutter if you're new to flutter, consider going through flutter's introductory tutorial https //flutter dev/docs/get started/codelab a back4app account sign up for a free account at back4app https //www back4app com/ back4app flutter sdk integrated into your project you can learn how to set it up by following the back4app flutter guide https //www back4app com/docs/flutter/parse sdk/flutter setup a code editor like visual studio code or android studio node js and npm installed for running back4app cloud functions install them from the official node js website https //nodejs org/ step 1 – setting up the back4app backend in this step, you will set up your back4app project, create the necessary classes (tables), and configure the backend to store event data, ticket information, and user profiles 1 1 create a new back4app application log in to your back4app account click on "create new app" enter an app name (e g , "eventbookingapp") and select your app icon click "create" 1 2 configure application keys navigate to your app's dashboard click on "app settings" > "security & keys" note down the application id and client key you will need these to initialize the parse sdk in your flutter app 1 3 define the data models you need to create the following classes in back4app event stores event details venue stores venue information ticket manages ticket availability and bookings user manages user profiles (default class) create the event class in the left sidebar, click on "database" to open the data browser click on "create a class" select "custom" , enter "event" as the class name, and click "create class" add the following columns to the event class name (string) description (string) date (date) image (file) venue (pointer to venue) price (number) create the venue class repeat the steps to create a new class named "venue" add the following columns name (string) address (string) capacity (number) seatingchart (file) create the ticket class create a new class named "ticket" add the following columns event (pointer to event) user (pointer to user) seatnumber (string) price (number) isbooked (boolean) 1 4 enable user authentication in the left sidebar, click on "server settings" > "general settings" under "authentication" , ensure that "enable class level permissions" is checked configure the user class permissions to allow users to sign up and log in 1 5 set up cloud functions (optional for payment processing) for payment integration, you might need to write cloud functions this step will depend on the payment gateway you choose (e g , stripe, paypal) refer to back4app's documentation on cloud code functions https //www back4app com/docs/platform/parse cloudcode step 2 – initializing the flutter project in this step, you will set up the flutter project and integrate the back4app parse sdk 2 1 create a new flutter project open your terminal and run flutter create event booking app navigate to the project directory cd event booking app 2 2 add dependencies open pubspec yaml and add the following dependencies 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 run flutter pub get to install the packages 2 3 initialize parse sdk in lib/main dart , import the necessary packages and initialize 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 } replace 'your back4app application id' and 'your back4app client key' with your actual keys from back4app step 3 – implementing user authentication users need to sign up and log in to book events and manage their profiles 3 1 create authentication screens create two new dart files 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 update main dart with routes 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 implement home screen create a home screen dart file where authenticated users are redirected import 'package\ flutter/material dart'; class homescreen extends statelesswidget { @override widget build(buildcontext context) { // build your home screen ui here } } step 4 – displaying events fetch events from back4app and display them in a list 4 1 create event model create a dart class 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 fetch events in home screen in home screen dart , fetch events and display them 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 create event details screen create 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'), ), ], ), ); } } step 5 – implementing seat selection allow users to select seats before booking 5 1 create seat selection screen create 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)), ), ); }, ), ); } } step 6 – processing payments integrate a payment gateway to process ticket payments securely 6 1 choose a payment gateway for this tutorial, we will assume the use of stripe https //stripe com/docs/payments 6 2 set up stripe account and obtain api keys sign up for a stripe account https //dashboard stripe com/register obtain your publishable key and secret key 6 3 add stripe dependency add stripe payment package to your pubspec yaml dependencies stripe payment ^1 0 9 run flutter pub get 6 4 implement payment screen create 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}'), ), ), ); } } note payment processing requires secure handling of sensitive data in a production app, you should process payments securely using your own server or cloud functions step 7 – managing user profiles allow users to view and manage their bookings and preferences 7 1 create profile screen create 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 add navigation to profile screen in your home screen dart or main navigation drawer, add a link to the profile screen iconbutton( icon icon(icons person), onpressed () { navigator push( context, materialpageroute(builder (context) => profilescreen()), ); }, ), step 8 – testing the app run your app using flutter run test the following functionalities sign up and log in view the list of events view event details select seats and proceed to payment process a payment (test mode if possible) view bookings in the profile conclusion congratulations! you have built a complete event booking app using flutter and back4app this app allows users to browse events, book tickets with seat selection, process payments, and manage their profiles and bookings from here, you can enhance your app by adding push notifications for event reminders implementing search and filtering for events enhancing the ui/ux with better design and animations securing payment processing with server side validation for more information on flutter and back4app features, check out flutter documentation https //flutter dev/docs back4app documentation https //www back4app com/docs parse server cloud code guide https //docs parseplatform org/cloudcode/guide/ by integrating flutter with back4app, you leverage a powerful combination to build scalable, feature rich mobile applications efficiently