In this task, Students will apply the knowledge gained from Tasks 1, 2, and 3 in Task 4. They will integrate visual assets and refine their prototype into a fully functional and complete product experience. Students are required to present the final published web version created using FlutterFlow.
Task 4 Progress
fig 2.1 Task 3 Progress Rate
In Task 3, I completed the user flow from the sign-up page to the product detail page. For Task 4, I continued by designing the add-to-cart page, followed by the payment and tracking pages. After completing all the necessary prototype screens, I connected them into a seamless flow and enhanced the project by adding functional features, visual animations, and interactive elements.
Product Detail Page (Selection Showing)
fig 2.2 - 2.3 Update App Status
I added an app state called "showinformation" with a Boolean type, allowing me to control the visibility using conditional visibility. When the user clicks anywhere on the page, the selection will be hidden. However, when they click the "Add to Cart" button, the Boolean value changes to true, making the selection panel visible.
fig 2.4 Selection showing Video
This video demonstrates that when the button is clicked, the information panel slides up, and when the close button is clicked, the selection panel is hidden.
fig 2.5 Counter Button added
In the selection page, I included a counter to adjust the product quantity using the built-in counter button in FlutterFlow. I learned how to use this feature by watching a tutorial on YouTube. After linking it properly, the counter button functioned as intended.
fig 2.6 Counter button Video
This video showcases the functionality of the counter button in action. Online Learning Video: https://youtu.be/HcYVeklShhM
fig 2.7 Firestore added
Since I wanted to create the "My Cart" page and connect it to the product detail page—so that when the "Add" button is clicked, the product is automatically added to the cart—I first needed to set up a Firestore collection for the cart.
My Cart Page
fig 2.8 Build up My Cart Page
Next, I created the "My Cart" page and built the layout before linking it to the product detail page.
fig 2.9 Text Variable
The information I needed to pass over included the product image, product name, and price. For each of these properties, I selected the corresponding fields from the product documents that were already linked to the product detail page.
fig 2.10 Query Collection added
For the ListView and container, I added a query collection and selected the same query type used in the product detail page. This allowed all the data to be linked seamlessly from the product detail page to the My Cart page.
fig 2.11 Animation in Lottiefiles
I created a new animation for the page that appears after the "Add to Cart" action, displaying a message saying "Added to Cart Successfully." This helps provide feedback to the user, letting them know their action was successful.
fig 2.12 Delete Action
Besides that, I also added a delete icon and set an action for it to remove the item from the cart by deleting the corresponding document from Firestore.
fig 2.13 Flow from product to cart page
This video shows the full process—from adding a product to the cart and displaying the success animation, to navigating to the My Cart page and deleting the product from the cart.
fig 2.14 Conditional Visibility Panel
I updated the conditional visibility for this panel so that when the check button is clicked, it slides up. The price display is also toggled—when the check button is turned on, the price is shown, but if it's toggled off, the price changes to RM 0.
fig 2.15 Panel showing Video
This demonstrates that when the toggle is switched on, the panel slides up and the price displays as RM 799. However, when the toggle is switched off, the price changes back to RM 0.
Payment Page
fig 2.16 Build up Payment Page
In the payment page, I designed the layout to be scrollable by adjusting the column properties, allowing the content to scroll vertically for better user experience.
fig 2.17 Switch Widget
I also included a switch widget that allows users to toggle it on and off. When toggled on, it applies a discount to the price, and when toggled off, the price returns to its original amount. This feature lets users see the price difference with and without the discount.
fig 2.18 Macro Animation - Slide left to right
When navigating to the payment page, the screen scrolls upward from the bottom. I also added a macro animation where the content slides in from left to right. This video highlights the animation in action.
fig 2.19 Payment Done Animation added
Between the payment page and the tracking page, I included a macro animation that indicates the payment process is complete. After the animation plays, it automatically transitions to the tracking page.
fig 2.20 Payment Animation Show
When the "Place Order" button is clicked, it navigates to the animation page and displays the "Payment Successful" animation.
Tracking Page
fig 2.21 - 2.24 Tracking Page Build up
Using the same concept, I built the tracking page based on the design I had created earlier. The challenging part was recreating the graphic design—I didn’t copy it exactly but made some adjustments to better fit the layout and functionality of the page.
fig 2.25 On page Animation on Tracking Status
In the tracking page, the main purpose is to display the tracking status to the user. To highlight the current parcel status, I used an on-page load animation with a loop type, applying a micro animation effect to the graphic button that indicates the current status.
fig 2.26 Flippable Card added
I modified the driver contact section to make it more interactive by turning it into a flippable card. This allows users to flip the card to view the driver's name and contact information, enhancing the user experience.
fig 2.27 On page Animation added
Since the flippable card initially appeared unclickable, I added a fade-in animation to highlight it and make it look interactive. This helps users recognize that the card has a function and encourages them to click on it, similar to a clickable button.
fig 2.28 - 2.29 Delivery Animation added
When the user clicks on the animated status icon button, an animation plays indicating the "Delivering" status. After displaying for about 4 seconds, it automatically navigates back to the tracking page.
fig 2.30 Show Tracking page in Profile Page
To make the tracking page more accessible, I integrated it directly into the profile page. This way, users can simply click on the profile page from the home page to view the tracking information within the project.
Other Functional Features
fig 2.31 - 2.32 Copy Function added
In the tracking page, I added a copy feature next to certain information. I discovered that I could make it functional by allowing users to copy specific text when they click on it, so I implemented this feature to enhance usability.
fig 2.33 Copy Function Video
After the user clicks the copy button, a reminder appears confirming that the text has been copied to the clipboard. This lets the user know they can now paste the information elsewhere.
fig 2.34 Alert Dialog added
To make the app feel more realistic, I added alert dialogs to buttons that don't have a function yet. This prevents user confusion by showing a message when those buttons are clicked, letting users know that the feature is not available yet.
fig 2.35 Alert Dialog Video
This video demonstrates how buttons that are not yet functional will trigger an alert dialog when clicked. It’s a simple feature to implement, but it’s important to ensure that all visible functions are accounted for, so users aren’t left confused.
fig 2.36 Share Function added
I also noticed that a functional feature I could add was the share button. On my product detail page, I included a share button and assigned an action to it using the "Launch URL" function.
fig 2.37 Share Function Video
For now, I’ve linked it to my project URL to demonstrate its functionality, allowing it to navigate to another page when clicked.
Problem Faced
fig 2.38 Wait Screen
I often had to wait a long time for the test mode to load, especially after adding new features and wanting to preview the changes. Because of this, I sometimes chose to publish the web version directly to view the outcome more quickly. In some cases, the web version loaded faster than the test mode. However, there were times when the published web version didn’t update to the latest changes immediately, even after publishing. I found that the published version would only reflect the latest updates after the test mode had been run at least once.
Final Published Web Version Click here to view the published web version. (Recommended: Adjust size to around 80% for better fit in web version / Best viewed on iPhone 14 Pro (430 × 932)).
fig 2.39 Final Published Web Version
Prototype Walkthrough Video
fig 2.40 Task 4 Prototype Walkthrough Video
Presentation Video Click here to view the task 4 Presentation Video in YouTube.
fig 2.41 Task 4 Presentation Video
Feedback
Week 14 General Feedback
Micro and micro-interactions are important parts of the project requirements. The completed app should look and feel like a real, fully functional application.
Reflection
Experience
In this final task, I became more familiar with FlutterFlow compared to before. This helped me avoid previous mistakes—for example, I now understand the importance of proper alignment to prevent layout issues, and I know how to use the right widgets to place content correctly. This saved me time from constantly readjusting layouts. I also explored more features in FlutterFlow, such as the copy button, which allows users to copy text directly. Exploring these new tools made my final app feel more functional. Of course, some features were still challenging—especially those involving parameter connections and Firebase integration, which required more learning and troubleshooting.
Observation
During development in FlutterFlow, I encountered errors when adding widgets and actions. After observing the process, I found the debug panel in test mode to be very useful. It lists all the widgets and shows their status, helping me identify which part isn’t working. Debugging is a cycle that requires persistence and patience, but the satisfaction of solving a problem makes the effort worth it.
Findings
I found that integrating Firebase was quite challenging. Even when following YouTube tutorials step by step, I faced issues—such as missing variables or unclear instructions. Some tutorials weren’t detailed enough, so I had to explore and figure things out myself. Sometimes, AI tools helped me solve problems by analyzing the specific issues I described. I also discovered that FlutterFlow occasionally has bugs, such as the published web version not updating immediately. At times, I had to wait or run the app in test mode first to see the latest updates. This repetitive process of testing and publishing became a part of my final task. It tested my patience, but I stayed motivated by focusing on the final outcome I wanted to achieve.
Comments
Post a Comment