Flutter Templates
Как создать приложение для бронирования событий с помощью Flutter и Back4App
34 мин
введение в современном быстром мире управление событиями и бронированиями через мобильные приложения стало все более важным приложение для бронирования событий позволяет пользователям просматривать предстоящие события, бронировать билеты, выбирать места и управлять своими бронированиями без проблем в этом учебном пособии вы узнаете, как создать полное приложение для бронирования событий с использованием flutter для фронтенда и back4app в качестве бэкенд сервиса к концу этого учебного пособия вы создадите функциональное приложение, которое отображает список событий с деталями позволяет пользователям просматривать расписания событий и информацию о местах проведения позволяет бронировать билеты с выбором мест обрабатывает платежи безопасно (интеграция с платежным шлюзом) управляет профилями пользователей, включая историю бронирований и предпочтения давайте начнем! предварительные требования чтобы завершить это учебное пособие, вам потребуется flutter sdk установлен на вашем локальном компьютере следуйте официальному руководству по установке flutter https //flutter dev/docs/get started/install базовые знания dart и flutter если вы новичок в flutter, рассмотрите возможность прохождения вводного учебника flutter https //flutter dev/docs/get started/codelab аккаунт back4app зарегистрируйтесь для получения бесплатного аккаунта на back4app https //www back4app com/ back4app flutter sdk интегрирован в ваш проект вы можете узнать, как его настроить, следуя руководству back4app по flutter https //www back4app com/docs/flutter/parse sdk/flutter setup редактор кода такой как visual studio code или android studio node js и npm установлены для запуска облачных функций back4app установите их с официального сайта node js https //nodejs org/ шаг 1 – настройка бэкенда back4app на этом этапе вы настроите свой проект back4app, создадите необходимые классы (таблицы) и настроите бэкенд для хранения данных о событиях, информации о билетах и профилях пользователей 1 1 создание нового приложения back4app войдите в свою учетную запись back4app нажмите на "создать новое приложение" введите название приложения (например, "eventbookingapp") и выберите свой иконка приложения нажмите "создать" 1 2 настройка ключей приложения перейдите на панель управления вашего приложения нажмите на "настройки приложения" > "безопасность и ключи" запишите идентификатор приложения и ключ клиента они понадобятся вам для инициализации parse sdk в вашем приложении flutter 1 3 определите модели данных вам нужно создать следующие классы в back4app событие хранит детали события место хранит информацию о месте билет управляет доступностью и бронированием билетов пользователь управляет профилями пользователей (класс по умолчанию) создайте класс события в левом боковом меню нажмите на "база данных" чтобы открыть обозреватель данных нажмите на "создать класс" выберите "пользовательский" , введите "событие" в качестве имени класса и нажмите "создать класс" добавьте следующие столбцы в класс событие имя (строка) описание (строка) дата (дата) изображение (файл) место (указатель на место) цена (число) создайте класс место повторите шаги, чтобы создать новый класс с именем "место" добавьте следующие столбцы имя (строка) адрес (строка) вместимость (число) плансидений (файл) создайте класс ticket создайте новый класс с именем "ticket" добавьте следующие столбцы событие (указатель на событие) пользователь (указатель на пользователя) номер места (строка) цена (число) забронировано (булевый) 1 4 включите аутентификацию пользователя в левой боковой панели нажмите на "настройки сервера" > "общие настройки" в разделе "аутентификация" , убедитесь, что "включить разрешения на уровне класса" отмечено настройте разрешения класса пользователь для разрешения пользователям регистрироваться и входить в систему 1 5 настройка облачных функций (необязательно для обработки платежей) для интеграции платежей вам может понадобиться написать облачные функции этот шаг будет зависеть от платежного шлюза, который вы выберете (например, stripe, paypal) обратитесь к документации back4app по облачные функции кода https //www back4app com/docs/platform/parse cloudcode шаг 2 – инициализация проекта flutter на этом этапе вы настроите проект flutter и интегрируете back4app parse sdk 2 1 создать новый проект flutter откройте терминал и выполните flutter create event booking app перейдите в каталог проекта cd event booking app 2 2 добавить зависимости откройте pubspec yaml и добавьте следующие зависимости 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 запустите flutter pub get для установки пакетов 2 3 инициализация parse sdk в lib/main dart , импортируйте необходимые пакеты и инициализируйте 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 } замените 'your back4app application id' и 'your back4app client key' на ваши реальные ключи из back4app шаг 3 – реализация аутентификации пользователей пользователи должны зарегистрироваться и войти в систему, чтобы забронировать мероприятия и управлять своими профилями 3 1 создание экранов аутентификации создайте два новых файла dart в 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 обновите main dart с маршрутами 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 обновите main dart с маршрутами 3 3 реализация главного экрана создайте файл home screen dart , куда будут перенаправлены аутентифицированные пользователи import 'package\ flutter/material dart'; class homescreen extends statelesswidget { @override widget build(buildcontext context) { // build your home screen ui here } } шаг 4 – отображение событий получите события из back4app и отобразите их в списке 4 1 создание модели события создайте класс dart event dart в 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 получение событий на главном экране в home screen dart , получайте события и отображайте их 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 создание экрана деталей события создать 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'), ), ], ), ); } } шаг 5 – реализация выбора мест позвольте пользователям выбирать места перед бронированием 5 1 создать экран выбора мест создайте 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)), ), ); }, ), ); } } шаг 6 – обработка платежей интегрируйте платежный шлюз для безопасной обработки платежей за билеты 6 1 выберите платежный шлюз для этого учебника мы будем предполагать использование stripe https //stripe com/docs/payments 6 2 настройте учетную запись stripe и получите ключи api зарегистрируйтесь для получения учетной записи stripe https //dashboard stripe com/register получите ваш публикуемый ключ и секретный ключ 6 3 добавьте зависимость stripe добавьте stripe payment пакет в ваш pubspec yaml dependencies stripe payment ^1 0 9 запустите flutter pub get 6 4 реализация экрана оплаты создайте 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}'), ), ), ); } } примечание обработка платежей требует безопасного обращения с конфиденциальными данными в производственном приложении вы должны обрабатывать платежи безопасно, используя свой собственный сервер или облачные функции шаг 7 – управление профилями пользователей позвольте пользователям просматривать и управлять своими бронированиями и предпочтениями 7 1 создать экран профиля создать 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 добавить навигацию на экран профиля в вашем home screen dart или главном навигационном меню добавьте ссылку на экран профиля iconbutton( icon icon(icons person), onpressed () { navigator push( context, materialpageroute(builder (context) => profilescreen()), ); }, ), шаг 8 – тестирование приложения запустите ваше приложение с помощью flutter run проверьте следующие функции зарегистрироваться и войти просмотреть список событий просмотреть детали события выбрать места и перейти к оплате обработать платеж (в тестовом режиме, если возможно) просмотреть бронирования в профиле заключение поздравляем! вы создали полное приложение для бронирования событий с использованием flutter и back4app это приложение позволяет пользователям просматривать события, бронировать билеты с выбором мест, обрабатывать платежи и управлять своими профилями и бронированиями отсюда вы можете улучшить свое приложение, добавив добавление push уведомлений для напоминаний о событиях реализация поиска и фильтрации событий улучшение ui/ux с помощью лучшего дизайна и анимаций обеспечение безопасности обработки платежей с помощью серверной валидации для получения дополнительной информации о функциях flutter и back4app, ознакомьтесь с документация flutter https //flutter dev/docs документация back4app https //www back4app com/docs руководство по облачному коду parse server https //docs parseplatform org/cloudcode/guide/ интегрируя flutter с back4app, вы используете мощное сочетание для эффективной разработки масштабируемых, богатых функционалом мобильных приложений