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 애플리케이션 키 구성하기 앱의 대시보드 로 이동하세요 클릭하세요 "앱 설정" > "보안 및 키" 다음 사항을 기록하세요 애플리케이션 id 및 클라이언트 키 flutter 앱에서 parse sdk를 초기화하는 데 필요합니다 1 3 데이터 모델 정의하기 back4app에서 다음 클래스를 생성해야 합니다 이벤트 이벤트 세부정보를 저장합니다 장소 장소 정보를 저장합니다 티켓 티켓 가용성 및 예약을 관리합니다 사용자 사용자 프로필을 관리합니다 (기본 클래스) 이벤트 클래스 생성하기 왼쪽 사이드바에서 "database" 를 클릭하여 데이터 브라우저를 엽니다 "create a class" 를 클릭합니다 "custom" , 클래스 이름으로 "event" 을 입력하고 "create class" 를 클릭합니다 다음 열을 event 클래스에 추가합니다 이름 (문자열) 설명 (문자열) 날짜 (날짜) 이미지 (파일) 장소 (장소에 대한 포인터) 가격 (숫자) 장소 클래스 만들기 새 클래스 이름으로 "venue" 를 만들기 위해 단계를 반복합니다 다음 열을 추가합니다 이름 (문자열) 주소 (문자열) 수용 인원 (숫자) 좌석 배치도 (파일) 티켓 클래스 생성 새로운 클래스를 생성합니다 "ticket" 다음 열을 추가합니다 이벤트 (이벤트에 대한 포인터) 사용자 (사용자에 대한 포인터) 좌석 번호 (문자열) 가격 (숫자) 예약됨 (부울) 1 4 사용자 인증 활성화 왼쪽 사이드바에서 "서버 설정" > "일반 설정" 을 클릭합니다 "인증" 아래에서 "클래스 수준 권한 활성화" 가 체크되어 있는지 확인합니다 사용자가 가입하고 로그인할 수 있도록 사용자 클래스 권한을 구성합니다 1 5 클라우드 함수 설정 (결제 처리 선택 사항) 결제 통합을 위해 클라우드 함수를 작성해야 할 수 있습니다 이 단계는 선택한 결제 게이트웨이에 따라 다릅니다 (예 stripe, paypal) 클라우드 코드 함수 https //www back4app com/docs/platform/parse cloudcode 에 대한 back4app의 문서를 참조하십시오 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 인증 화면 만들기 lib/ 디렉토리에 두 개의 새로운 dart 파일을 만드세요 login screen dart signup screen dart 로그인 화면 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 } } 회원가입 화면 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 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을 사용하여 완전한 이벤트 예약 앱을 구축했습니다 이 앱은 사용자가 이벤트를 탐색하고, 좌석 선택과 함께 티켓을 예약하고, 결제를 처리하며, 프로필과 예약을 관리할 수 있도록 합니다 여기에서 앱을 향상시킬 수 있습니다 이벤트 알림을 위한 푸시 알림 추가 이벤트 검색 및 필터링 구현 더 나은 디자인과 애니메이션으로 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을 통합함으로써 확장 가능하고 기능이 풍부한 모바일 애플리케이션을 효율적으로 구축할 수 있는 강력한 조합을 활용하게 됩니다