Flutter Templates
FlutterとBack4Appを使ってイベント予約アプリを構築する方法
32 分
はじめに 今日の急速に変化する世界では、モバイルアプリケーションを通じてイベントや予約を管理することがますます重要になっています。イベント予約アプリを使用すると、ユーザーは今後のイベントを閲覧し、チケットを予約し、座席を選択し、予約をシームレスに管理できます。このチュートリアルでは、フロントエンドに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アカウントにログインします。 「 "create new app" 」をクリックします。 「 app name (例:"eventbookingapp")を入力し、 app icon を選択します。 「 create 」をクリックします。 1 2 アプリケーションキーの設定 アプリの dashboard に移動します。 「 app settings 」をクリックし、 「security & keys」 を選択します。 「 application id 」と client key をメモします。これらはflutterアプリでparse sdkを初期化するために必要です。 1 3 データモデルを定義する back4appに以下のクラスを作成する必要があります イベント イベントの詳細を保存します。 会場 会場の情報を保存します。 チケット チケットの可用性と予約を管理します。 ユーザー ユーザープロフィールを管理します(デフォルトクラス)。 イベントクラスを作成する 左のサイドバーで、 "database" をクリックしてデータブラウザを開きます。 をクリックします。 "create a class" を選択します。 "custom" , クラス名として "event" を入力し、 "create class" をクリックします。 次の列を event クラスに追加します 名前 (string) 説明 (string) 日付 (date) 画像 (file) 会場 (pointer to venue) 価格 (number) 会場クラスを作成する "venue" という新しいクラスを作成する手順を繰り返します。 次の列を追加します 名前 (string) 住所 (string) 収容人数 (number) 座席表 (file) チケットクラスを作成する 新しいクラスを作成します "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 認証画面を作成する lib/に新しいdartファイルを2つ作成します。 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 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 cloud codeガイド https //docs parseplatform org/cloudcode/guide/ flutterとback4appを統合することで、スケーラブルで機能豊富なモバイルアプリケーションを効率的に構築するための強力な組み合わせを活用できます。