Application Design 2 - Task 3: Interactive Component Design & Development
Lew Guo Ying / 0365721 / Bachelor of Design in Creative Media
Application Design 2
Task 3: Interactive Component Design & Development
Index
Lectures
We started by creating two Firestore collections:
-
products: name, description, image, price, quantity, createdAt
-
reviews: productRef (linked), username, comments, rating, timestamp
-
Image
-
Product Name
-
Description
-
Price
We created a new collection named
cart with the following fields:
-
user_id(string) -
product_ref(document reference toproducts) -
quantity(integer) -
added_at(timestamp)
cart collection.
cart collection. If
they did, we moved on to building the cart display.
ListView widget. Data was
fetched using a backend query filtered by the current user's ID. Each cart
item shows the product
name,
image, and
price, retrieved via
document from reference.
cart collection. A key lesson:
make sure you’re deleting from the correct collection—don’t accidentally remove the product itself!
Requirement:
In this task, I was required to go beyond static visuals and actually develop interactive components for my app using HTML, CSS, and JavaScript. Unlike Task 2 where I focused on planning and prototyping, this time I needed to build working interactions that are ready to be integrated into the final product.
I was encouraged to think creatively about how animations and interactions could enhance the user experience. Some of the components I considered include:
-
Navigation menus with animated icons
-
Pop-up boxes and modal interactions
-
Interactive buttons with visual feedback
-
Smooth screen transitions
Task 3 Progress
-
Entire MVP flow – Quick booking steps from movie to confirmation
-
Basic animations – e.g., loading bar in the splash scene
-
Pop-up panels – Login and cart interactions
-
Conditional button activation – Buttons only work when all requirements are met
-
Navigation actions – Buttons that navigate to the correct pages
-
Expandable quick booking button on homepage
-
Seat and ticket type selection UI
-
Booking progression bar – Covers 5 key steps: movie → seat → food → payment → success
🔧 What’s Next :
-
Hamburger menu & sidebar implementation
-
Sign-up flow with OTP verification animation
-
Scene transitions – Top bars, bottom navigation, and smooth flow between screens
-
Additional pages – Movies, location, profile, promotions
-
Payment success animation
Flutterflow Progress:
A. Setting Up the Foundation of My App
Before jumping into the interaction and animations, I spent time preparing the foundational settings of the app in FlutterFlow. This preparation helped streamline the later development process and ensured consistency across all components.
|
|
| Fig2.1 Theme & Styling |
-
Amaranth – used for headings with a more expressive and friendly tone
-
Montserrat – used for body text and UI elements due to its clean readability
-
CTA Button
-
Card UI
-
TextField Input
This allowed me to reuse these components throughout the app without redefining styles every time.
-
LFS Cinema branding logo
-
Background image
-
Movie posters
-
Icons for tickets, wallets, food, QR, etc.
-
Food images for the concession selection
Having these ready in the media library made it faster to build the UI and assign visuals to relevant components.
V. Storyboard & Structure Overview
|
|
| Fig2.4 Storyboard |
I created around 18 pages in total, including:
-
Functional pages (e.g. Home, QuickBooking, SeatSelection)
-
User flow pages (e.g. Login, SignUp, OTP verification)
-
Feedback animations (e.g. Loading screen, Payment success)
-
Booking steps (e.g. CartDetails, Checkout, Voucher, Payment)
|
|
| Fig2.6 Components and Pages |
To improve reusability and consistency, I developed several custom components, such as:
-
Seats – seat selection interface
-
TimeSelector / DateSelector – for booking logic
-
QuickBookingBtn – collapsible booking shortcut
-
CartDetailsPopOut / LoginBottomSheet – pop-up panels
-
HamburgerMenuComponent – side menu structure
-
Cards – movie, voucher, and ticket summary cards
These components helped me maintain modular design and made the UI easier to scale and manage.
B. Page Design
1. Splash & Loading Screen
|
|
| Fig2.7 Loading Screen |
I translated each layout from Figma to FlutterFlow as closely as possible, maintaining hierarchy and reusability. While FlutterFlow offers built-in widgets like the ProgressBar, I found it too limiting for my visual style, so I opted to create my own version from scratch.
Creating a Custom Progress Bar
|
|
| Fig2.8 Progress Bar |
Instead of using the default progress bar, I built my own using:
-
A Row widget that holds multiple Containers.
-
Each container acts as a step in the progress bar.
-
I defined a local state variable called
loadingPercentthat gradually increases on page load. -
The containers' colors change based on that value using a conditional color logic (If/Then/Else).
-
I also bind the
loadingPercentto a Text widget, so users can see the percentage increase in real time.
This method gave me full control over the visual appearance and dynamic behavior, allowing the loading bar to feel more on-brand and animated rather than static.
2. Login & Sign Up Page
|
|
| Fig2.9 Sign up & Login |
In designing the login and sign-up flow, my main focus was clarity, flexibility, and modularity. I ensured that the page layout stayed consistent with my brand's tone while providing users multiple authentication options.
Using Rich Text for Enhanced Display
I chose Rich Text instead of regular Text widgets for areas with multiple styles in one sentence (like the footer message). This allowed me to:
-
Emphasize certain words with color and font weight
-
Use tap triggers for embedded links
-
Maintain text responsiveness and styling harmony
|
|
| Fig2.10 Bottom Sheet |
The login button action uses FlutterFlow’s Bottom Sheet component to display a clean and interactive login pop-up:
-
Triggered via
On Tap → Bottom Sheet: LoginBottomSheet -
Configured height at
700px, draggable, and dismissible by tapping outside -
A transparent overlay adds depth and focus to the modal
-
Supports multiple login options: Google, Facebook, Apple, and email login
This aligns with modern UX practices and FlutterFlow’s recommendation for layered modal behavior
By setting the login form as a reusable component, I can call it from other screens without rewriting the structure. This modular approach helps with scalability and future maintenance, consistent with FlutterFlow’s component-first design philosophy.
3. Homepage
|
|
| Fig2.11 Homepage |
|
|
| Fig2.12 Quick Booking Button |
One of the more technically challenging features here was the draggable button that can slide in and out from the side of the screen. To achieve this, I created a component and used conditional visibility tied to a boolean state variable. The button’s border radius and arrow direction also dynamically change based on the same state.
To keep the homepage modular and manageable, I also converted key sections into components—including the carousel for featured movie posters at the top. I originally wanted to make the carousel auto-slide, but FlutterFlow currently doesn’t support that natively.
|
|
| Fig2.13 Homepage |
Below the carousel, I implemented a TabView that lets users toggle between “Now Showing” and “Coming Soon” movie lists. These lists are scrollable and designed to showcase multiple movies in a compact, accessible layout.
Finally, users can tap the Quick Booking button to jump straight into the core MVP booking flow, making the process fast and streamlined from homepage to confirmation.
4. Quick Booking Page
|
|
| Fig2.14 Quick Booking Page |
The next section is the Quick Booking page. At the top, users will see a home button and a prominent “Quick Booking” title. Below that are the date selector, cinema location, movie selection, and showtime options. The “Select Seat” button at the bottom remains disabled until both a date and a time are selected.
|
|
| Fig2.15 Component in Quick Booking Page |
Most elements on this page are built as components to make state control easier. Instead of using a boolean, I implemented string-based conditions with “equal to” logic to track user selections. Once selected, the active item is highlighted in light yellow. The showtime options are placed in a scrollable row, allowing users to swipe through available times.
|
|
| Fig2.16 Comparison |
When all required details are selected, the “Select Seat” button becomes clickable, visually indicated by the light yellow highlight. The change is clearly visible in the comparison images.
5. Seat Selection & Ticket Type
|
|
| Fig2.17 Seat Component |
On the Seat Selection and Ticket Type pages, I first designed the seat layout inside a component. The progression bar at the top updates accordingly — once this step is completed, the indicator becomes checked and highlighted in light yellow.
|
|
| Fiog2.18 Seat Selection and Ticket Type |
Movie details such as title, time, and cinema location are displayed prominently at the top of the screen. After selecting a seat, users can tap the button to proceed to the ticket selection screen. Ticket types — Adult, Children, Students, and Seniors — are chosen using plus/minus buttons. If no ticket is selected or the combination is invalid, the “Next” button remains disabled.
6. Food & Beverage and Cart
|
|
| Fig2.19 Food Category |
|
|
| Fig2.20 Food |
Next comes the Food and Beverage page. Upon entry, the progress bar advances to the next step. Users can select from categories (e.g., Promotions, Top Sellers) at the top, then scroll through the items below. Once an item is selected, the “Add to Cart” button becomes active and leads to the next step.
|
|
| Fig2.21 Cart Pop up |
Finally, a cart summary panel slides up from the bottom — I limited its height to around 500px to reduce blank space. It displays a detailed breakdown of the booking: seat info, food & drink choices, and processing fees, along with a “Check Order Summary” button for final review.
7. Checkout Page & Vouncher
|
|
| Fig2.22 Checkout |
|
|
| Fig2.23 Progress bar |
Now we’ve reached the final stage: payment. After reviewing the cart, users are shown the total sum and a breakdown of all charges. You can also see the changes in the progress bar—both in parameters and color—as it updates dynamically. I used
currentStepIndex with an
integer value to determine the
current step, so that the
highlighted yellow color and
checkmark indicators appear
accordingly.
|
|
| Fig2.24 Vouncher |
At this point, users can also redeem vouchers. Only one voucher can be selected at a time—when a second voucher is tapped, it automatically replaces the previous one. A visible orange border and tick icon provide clear feedback on the selected option. Once applied, the discount appears in the checkout panel in green for easy visibility.
8. Payment & Animation
|
|
| Fig2.25 Payment |
The final page is the payment screen, which offers several payment options: FPX, credit cards, LFS Wallet, and e-wallets. The selected method is highlighted, and the "Proceed to Payment" button becomes active. At the top, the progress bar reflects the final stage of the process.
|
|
| Fig2.26 Animation of payment |
As for the animation, it begins playing automatically and transitions to a confirmation button once the payment is successful, allowing users to view their ticket. These animations were part of the final tasks, and I used visibility conditions to control when each element is shown based on state.
Submission
Flutterflow LFS Cinema App in Run Mode: https://app.flutterflow.io/run/JlW0rCsAKPY24FE9cGuG
Publish to Web Link: https://lfscinema-guoying.flutterflow.app/Walkthrough Video:
Reflections
Experience
Observation
Findings
Comments
Post a Comment