From 575cacb5c0a9d13f66d219941492deba662df7c4 Mon Sep 17 00:00:00 2001
From: mrdavidorok
Date: Fri, 1 Aug 2025 01:00:43 +0100
Subject: [PATCH 1/2] consolidated articles from the folder "how to build in
FF" in to the main docs, reordered the articles, updated content
---
.../adding-customization/build-iot-app.md | 54 ++++++++
.../animations/custom-loading-bottom-sheet.md | 72 +++++++++++
.../custom-navbar-setup.md | 82 ++++++++++++
.../pageview-widget.md | 51 ++++++++
.../notifications/push-notifications.md | 25 ++++
.../authentication/custom-login-routing.md | 118 ++++++++++++++++++
.../supabase-search-implementation.md | 52 ++++++++
.../retrieve-device-location-address.md | 94 ++++++++++++++
.../api/API Call Error Handling..md | 114 +++++++++++++++++
.../backend-query/query-collection.md | 91 +++++++++++++-
10 files changed, 752 insertions(+), 1 deletion(-)
create mode 100644 docs/ff-concepts/adding-customization/build-iot-app.md
create mode 100644 docs/ff-concepts/animations/custom-loading-bottom-sheet.md
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/custom-navbar-setup.md
create mode 100644 docs/ff-integrations/authentication/custom-login-routing.md
create mode 100644 docs/ff-integrations/database/supabase/supabase-search-implementation.md
create mode 100644 docs/ff-integrations/maps/google-maps/retrieve-device-location-address.md
create mode 100644 docs/resources/control-flow/backend-logic/api/API Call Error Handling..md
diff --git a/docs/ff-concepts/adding-customization/build-iot-app.md b/docs/ff-concepts/adding-customization/build-iot-app.md
new file mode 100644
index 00000000..cba58a3a
--- /dev/null
+++ b/docs/ff-concepts/adding-customization/build-iot-app.md
@@ -0,0 +1,54 @@
+---
+keywords: ['iot', 'bluetooth', 'mqtt', 'flutter packages']
+slug: /build-iot-app
+title: Build an IoT App
+---
+
+# Build an IoT App
+
+An IoT (Internet of Things) app is designed to connect, monitor, and control smart devices such as sensors, thermostats, and Bluetooth-enabled devices. With FlutterFlow, it’s possible to build the front-end of an IoT app and extend its capabilities using custom code and Flutter packages.
+
+:::info[Prerequisites]
+- Familiarity with FlutterFlow’s Custom Code feature.
+- Access to target IoT devices or a simulation environment.
+- Understanding of device communication protocols such as Bluetooth or MQTT.
+:::
+
+1. **Set Up the Flutter App Structure**
+
+ Use FlutterFlow’s UI builder to create the structure of your IoT app. Common pages include:
+ - Device List
+ - Device Control Panel
+ - Settings and Connectivity
+
+2. **Integrate Custom Code or Packages**
+
+ FlutterFlow supports using custom Dart code and Flutter packages. You can use this to manage device connectivity and communication.
+
+ :::note
+ To use external packages, you must add them via **Custom Code > Packages** in your project settings.
+ :::
+
+ Popular Flutter packages for IoT functionality include:
+
+ - `flutter_blue`: Connect to and communicate with Bluetooth Low Energy (BLE) devices.
+ - `iot_sensors`: Access common sensor data such as temperature, humidity, and acceleration.
+ - `mqtt_client`: Communicate with MQTT brokers, a common protocol in IoT systems.
+ - `flutter_mqtt`: Publish and subscribe to MQTT messages from within your app.
+
+3. **Manage Device Connections and State**
+
+ Use custom actions and logic to:
+ 1. Scan for available devices.
+ 2. Connect or disconnect from a device.
+ 3. Read or write values (e.g., sensor data, device commands).
+ 4. Display real-time device states using local state or Firestore sync.
+
+4. **Test on Physical Devices**
+
+ IoT features such as Bluetooth or MQTT often require testing on real hardware. Simulators or emulators may not support these protocols.
+
+ :::warning
+ FlutterFlow's custom code executes only on physical devices or when building for mobile. Make sure to test using real devices for Bluetooth or sensor-related features.
+ :::
+
diff --git a/docs/ff-concepts/animations/custom-loading-bottom-sheet.md b/docs/ff-concepts/animations/custom-loading-bottom-sheet.md
new file mode 100644
index 00000000..ea5f1b87
--- /dev/null
+++ b/docs/ff-concepts/animations/custom-loading-bottom-sheet.md
@@ -0,0 +1,72 @@
+---
+keywords: ['make', 'custom', 'indicator', 'bottom sheet', 'loading']
+slug: /custom-loading-bottom-sheet
+title: Create a Custom Loading Animation Using a Bottom Sheet
+---
+
+# Create a Custom Loading Animation Using a Bottom Sheet
+
+Use a custom `Bottom Sheet` to display a loading animation while performing long-running actions such as API calls, database writes, or chained workflows. This guide walks through how to build a non-blocking custom loading indicator.
+
+
+
+:::info[Prerequisites]
+- A `Bottom Sheet` component with a loading animation (e.g., Lottie, GIF, or static image)
+- A page where you want to trigger the loading sequence
+:::
+
+1. **Create a Bottom Sheet Component**
+
+ 1. Go to the **UI Builder** and create a new `Component`.
+ 2. Select the **Bottom Sheet** layout.
+ 3. Add a loading animation:
+ - Use a **Lottie** animation, **GIF**, or any custom UI for the loading indicator.
+ - You can also include a `Text` widget to display a status message.
+
+ 
+
+ This component will serve as the visual loading indicator during your action chain.
+
+2. **Set Up the Action Workflow**
+
+ On the page where you want to trigger the loading sequence:
+
+ 1. **Trigger the workflow** (e.g., on button press).
+ 2. Add a `Delay` action to simulate a task (optional).
+ 3. Add the `Open Bottom Sheet` action and configure it to be **non-blocking**.
+
+ 
+
+ 
+
+ :::warning
+ Enable the **Non Blocking** option in the `Open Bottom Sheet` action. This allows the workflow to continue running while the bottom sheet is visible.
+ :::
+
+3. **Add the Main Actions**
+
+ 1. Add the primary actions you want to perform while the loading indicator is active.
+ - These could include `API Calls`, `Create Document`, `Update Document`, or chained actions.
+ 2. For demonstration, a `Delay` of 5 seconds is used to simulate long-running tasks.
+
+4. **Dismiss the Bottom Sheet**
+
+ Once all actions are complete:
+
+ 1. Add a `Close Bottom Sheet` action to remove the loading indicator.
+
+ 
+
+5. **Show a Confirmation Message**
+
+ 1. Add a `Show SnackBar` action to display a success message to the user.
+
+ This confirms that the actions are complete and the bottom sheet has been dismissed.
+
+ 
+
+You can test this implementation in the public project:
+ - Navigate to the **CustomLoading** page
+ - Tap **Login** on the login screen using the test account
+ - Select **Custom Loading** from the home page to view it in action
+
diff --git a/docs/ff-concepts/navigation-routing/special-page-navigation/custom-navbar-setup.md b/docs/ff-concepts/navigation-routing/special-page-navigation/custom-navbar-setup.md
new file mode 100644
index 00000000..c213675f
--- /dev/null
+++ b/docs/ff-concepts/navigation-routing/special-page-navigation/custom-navbar-setup.md
@@ -0,0 +1,82 @@
+---
+keywords: ['custom', 'navbar', 'navigation', 'app bar']
+slug: /custom-navbar-setup
+title: Custom Navigation Bars
+---
+
+# Custom Navigation Bars
+
+Build a custom `Navigation Bar` (NavBar) to support dynamic views, role-based access, or complex widget layouts such as embedded cart counters or animated icons. Unlike the default NavBar widget, this approach gives full control over design and visibility.
+
+
+
+:::info[Prerequisites]
+- A component to be used as the custom NavBar.
+- Pages with `Stack` layout to allow overlay positioning.
+- Local State variable or conditional logic to control visibility.
+:::
+
+Follow the steps below:
+
+1. **Build the NavBar Component**
+
+ 1. Create a **Component** and design your NavBar layout.
+ 2. Add widgets as needed: icons, labels, counters, conditional containers, etc.
+ 3. Ensure the NavBar’s height is consistent across screens (e.g., `100px`).
+
+2. **Add the NavBar to Your Pages**
+
+ 1. Wrap the page layout in a `Stack`.
+ 2. Place the NavBar component inside a `Container` widget.
+ - Set the container’s vertical alignment to `1` (bottom).
+ - Set its width and height to match screen width and desired NavBar height.
+
+ ```plaintext
+ Page
+ └─ Stack
+ ├─ Main Page Content
+ └─ Container (height: 100px, align: bottom)
+ └─ NavBar Component
+ ```
+
+3. **Configure NavBar Behavior**
+
+ 1. Add `Bottom Padding` to your main page content equal to the NavBar’s height. This prevents the NavBar from overlapping other widgets.
+
+ 
+
+ 2. Use `Local State`, `App State`, or conditional logic from a database (e.g., `is_admin`) to control:
+ - Which version of the NavBar appears.
+ - Whether the NavBar is visible at all.
+
+ :::warning
+ Avoid placing the custom NavBar on subpages. NavBar components should only be used on top-level pages. Adding back navigation (e.g., `Pop` actions) to these pages may result in routing issues.
+ :::
+
+**Example: Conditional NavBar Logic**
+
+ You can conditionally display different layouts depending on the user’s role:
+ - **Admin** users may see extra items or a different layout.
+ - **Standard** users may have limited options.
+ - Use the `is_admin` field from the `Users` collection to control this logic dynamically.
+
+**Sample Project:**
+
+ A public sample project is available demonstrating:
+ - A basic custom NavBar
+ - A conditional NavBar that changes layout based on user role
+
+ **How to Use the Sample:**
+
+ 1. Launch the project.
+ 2. Tap **Login** using the pre-configured test user.
+ 3. Navigate to:
+ - **Custom NavBar/AppBar** to view a static NavBar layout.
+ - **Conditional NavBar** to explore role-based NavBar behavior.
+ - Toggle the `is_admin` field to test both states.
+
+ 
+
+ 
+
+ 
diff --git a/docs/ff-concepts/navigation-routing/special-page-navigation/pageview-widget.md b/docs/ff-concepts/navigation-routing/special-page-navigation/pageview-widget.md
index 70f20306..5d666147 100644
--- a/docs/ff-concepts/navigation-routing/special-page-navigation/pageview-widget.md
+++ b/docs/ff-concepts/navigation-routing/special-page-navigation/pageview-widget.md
@@ -49,6 +49,57 @@ To add the PageView widget to your app:
+## Use Case: Image Carousel with Auto-Scroll
+
+You can build an image carousel using the `PageView` widget combined with the `Control Page View` action. This allows users to scroll through images either manually or automatically.
+
+**Steps Overview:**
+
+ 1. **Add a PageView Widget**
+ - From the **Widget Panel**, drag the `PageView` widget onto the canvas.
+ - Populate it with your image widgets or bind it to a dynamic image list.
+
+ 2. **Set Up Page Load Action**
+ - Select the `Scaffold` or main container.
+ - Add a `Page Load` action to trigger carousel behavior.
+
+ 3. **Add `Control Page View` Action**
+ - Use the `Control Page View` action to control transitions:
+ - `Next`, `Previous`, `First`, or `Last`.
+
+ 4. **Auto-Scroll Behavior (Optional)**
+ - Add a sequence of:
+ - `Control Page View` → `Wait` → `Control Page View` (Next)
+ - Loop this logic to create a smooth, timed carousel experience.
+
+ 
+
+## Use Case: Image Slider from List of Image URLs
+
+This example demonstrates how to build a dynamic image slider using a list of image URLs—ideal for product detail screens or galleries.
+
+Follow the steps below:
+
+1. **Add a PageView Widget**
+ - Place a `PageView` on your screen.
+
+2. **Bind to the Image List**
+ - Generate dynamic children from your list of image URLs.
+
+3. **Add a Repeating Child**
+ - Use a single `Image` widget inside the `PageView`.
+ - Bind the `Image URL` to the current list item.
+
+ :::tip
+ You only need one child inside the PageView. When bound to a list, it automatically repeats for each item.
+ :::
+
+ :::tip
+ - Use horizontal scroll for carousels and onboarding pages.
+ - Combine with indicators or swipe gestures for a richer UX.
+ - Use `Wait` and `Control Page View` actions to create auto-scroll behavior.
+ :::
+
## Adding infinite scroll
The PageView widget is an incredibly versatile widget that can be utilized in a variety of situations to create interactive applications. For example, you might want to use it in an app that involves reading books, magazines, or similar content to mimic the experience of flipping through pages.
diff --git a/docs/ff-concepts/notifications/push-notifications.md b/docs/ff-concepts/notifications/push-notifications.md
index 0fe7c3e5..2922e264 100644
--- a/docs/ff-concepts/notifications/push-notifications.md
+++ b/docs/ff-concepts/notifications/push-notifications.md
@@ -237,6 +237,31 @@ In this action, you can decide who should receive the push notification by setti

+### Send Notifications to Multiple Users (Dynamic)
+
+To notify a group of users when a document is created (e.g., group chat, announcement, or event), follow this flow:
+
+1. **Add a Backend Query**
+ - Add an **Action** → **Backend Query** before sending the notification.
+ - Set **Query Type** to `Query Collection` and select your users collection (e.g., `users`).
+ - Set **Return Type** to `List of Documents`.
+
+2. **Create a Document**
+ - Add an **Action** → **Create Document** to store the submitted content (e.g., a post or message).
+
+3. **Trigger Notification**
+ - Add an **Action** → **Trigger Push Notification**.
+ - Set the **audience** to **Multiple Recipients**.
+ - Under **Recipients**:
+ - Select **Filter List Items** → **Items in List > Document Exists** to apply conditions.
+ - Then choose **Map List Items** → `Document Properties` → `Reference` to get user document references.
+
+ The notification will be sent to all users matching your filters, using the queried list.
+
+ :::tip
+ Use this approach for dynamic group-based notifications tied to app activity, like chat, announcements, or tasks.
+ :::
+
## Testing Push Notifications Cloud Function
You can also test the Push Notifications Cloud Function directly from the Google Cloud console, without needing to trigger from FlutterFlow. This is especially useful for debugging purposes. For step-by-step instructions, including an example and how to structure the request, refer to the [Testing Cloud Functions in Google Cloud Console](../../ff-concepts/adding-customization/cloud-functions.md#testing-cloud-functions-in-google-cloud-console) section.
diff --git a/docs/ff-integrations/authentication/custom-login-routing.md b/docs/ff-integrations/authentication/custom-login-routing.md
new file mode 100644
index 00000000..f43d0fe9
--- /dev/null
+++ b/docs/ff-integrations/authentication/custom-login-routing.md
@@ -0,0 +1,118 @@
+---
+keywords: ['firebase', 'custom', 'routing']
+slug: /custom-login-routing
+title: Custom Login Routing
+---
+
+# Custom Login Routing
+
+This article explains how to configure custom routing logic for users after they log in, using a mission control (checkup) page. You can route users differently based on their admin status or whether they’ve completed onboarding.
+
+:::info[Prerequisites]
+- A FlutterFlow project with **Firebase** set up.
+- Authentication configured in the project.
+- The following app pages created:
+ - `LoginPage`
+ - `OnboardingPage`
+ - `AdminHomePage`
+ - `UserHomePage`
+ - `CheckupPage` (Mission Control Page)
+:::
+
+**Create a Local State Variable**
+
+ Create a local state variable to track whether the user is logging in for the first time.
+
+ 1. Go to **Local State** > **+ Add State Variable**.
+ 2. Name the variable `firstTime`.
+ 3. Set the type to `Boolean` and enable **Persist**.
+
+ :::tip
+ The **Persist** setting retains the value locally on the device until the app is uninstalled. It will reset on every refresh when testing in a web browser.
+ :::
+
+ 
+ 
+
+**Add a User Field for Admin Check**
+
+ 1. Open **Firebase** > **User Collection** > **+ Add Field**.
+ 2. Create a field called `isAdmin` and set the type to `Boolean`.
+
+ This allows conditional routing based on the admin role.
+
+ 
+ 
+
+**Configure Initial Pages**
+
+ 1. Go to **Settings & Integrations** > **App Details** > **Initial Page**.
+ 2. Set:
+ - **Entry Page** to `LoginPage`
+ - **Logged In Page** to `CheckupPage`
+
+ :::tip
+ **Entry Page** appears when no user is logged in.
+ **Logged In Page** is used when a user is already authenticated.
+ :::
+
+ 
+
+**Define Actions on the Checkup Page**
+
+1. **Check If User Is Logged In**
+
+ 1. Open the **CheckupPage** in the **Action Flow Editor**.
+ 2. Under **On Page Load**, add a **Conditional Action**.
+ 3. Set source to `Global Properties` > `Is User Logged In`.
+
+ - If `FALSE`:
+ - Add action: **Navigate To** `LoginPage`, disable **Back Navigation**, then **Add Terminate**.
+
+ 
+ 
+ 
+
+2. **Check If User Is New (First Time Login)**
+
+ 1. Under the `TRUE` branch of "Is User Logged In", add another **Conditional Action**.
+ 2. Set condition: `Local State` > `firstTime`.
+
+ - If `TRUE`:
+ - Add action: **Navigate To** `OnboardingPage`, disable **Back Navigation**, then **Add Terminate**.
+
+ 
+
+3. **Check If User Is an Admin**
+
+ 1. Under the `FALSE` branch of `firstTime`, add a **Conditional Action**.
+ 2. Set condition: `Authenticated User` > `isAdmin`.
+
+ - If `TRUE`:
+ - Navigate to `AdminHomePage`, disable back navigation, then **Terminate**.
+
+ - If `FALSE`:
+ - Navigate to `UserHomePage`, disable back navigation, then **Terminate**.
+
+ 
+
+**Update `firstTime` After Onboarding**
+
+ To avoid showing the onboarding page again, update the `firstTime` variable after onboarding:
+
+ 1. On the `OnboardingPage`, select the **Start** button.
+ 2. Open the **Action Flow Editor**.
+ 3. Add action: **Update Local State** > `firstTime` → set value → `False`.
+ 4. Add navigation: **Navigate To** `CheckupPage`, disable back navigation.
+
+ 
+ 
+
+:::tip
+You can reuse the `CheckupPage` to add more advanced routing conditions, such as checking if the user has completed their profile or enabled certain settings.
+:::
+
+To skip onboarding for admins as well, extend your logic by nesting onboarding logic inside the admin check condition.
+
+
+
diff --git a/docs/ff-integrations/database/supabase/supabase-search-implementation.md b/docs/ff-integrations/database/supabase/supabase-search-implementation.md
new file mode 100644
index 00000000..a2636589
--- /dev/null
+++ b/docs/ff-integrations/database/supabase/supabase-search-implementation.md
@@ -0,0 +1,52 @@
+---
+keywords: [search, implementation, tutorial]
+slug: /supabase-search-implementation
+title: Supabase Search Implementation
+---
+
+# Supabase Search Implementation
+
+This article outlines a workaround to implement basic search functionality using Supabase in FlutterFlow. While FlutterFlow does not currently support full Supabase search natively, you can use the Realtime feature combined with input filters for a basic search experience.
+
+:::info[Prerequisites]
+- A Supabase project integrated with your FlutterFlow app.
+- Realtime enabled in the relevant Supabase table.
+:::
+
+Follow the steps below to implement Supabase Search:
+
+ - **Enable Realtime in Supabase**
+
+ 1. Open your Supabase project and go to **Table Editor**.
+ 2. Select the relevant table.
+ 3. Enable **Realtime** updates from the table settings.
+
+ 
+ 
+
+ - **Filter Query Data Using an Input Field**
+
+ 4. In FlutterFlow, add an **Input Text Field** to your UI.
+ 5. Configure your **Query Collection** to apply a filter using the input value.
+ - Set the filter condition to `is equal to`.
+
+ 
+
+ - **Choose a Trigger Method for Search**
+
+ - Auto-Search on Input Change
+
+ 6. Enable **Update Page on Change**.
+ 7. Set the update frequency to your desired interval.
+
+ 
+
+ - **Manual Search on Submit**
+
+ 8. Refresh the query manually when the input text is submitted.
+
+ 
+
+:::warning
+Using real-time updates for live search may incur higher costs compared to performing a search on submission.
+:::
diff --git a/docs/ff-integrations/maps/google-maps/retrieve-device-location-address.md b/docs/ff-integrations/maps/google-maps/retrieve-device-location-address.md
new file mode 100644
index 00000000..e90f8d4c
--- /dev/null
+++ b/docs/ff-integrations/maps/google-maps/retrieve-device-location-address.md
@@ -0,0 +1,94 @@
+---
+keywords: ['api', 'geocoding', 'location', 'address', 'latlng']
+slug: /retrieve-device-location-address
+title: Retrieve Address From Location (Geocoding)
+---
+
+# Retrieve Address From Location (Geocoding)
+
+You can convert the current device location into a full address (including country, city, state, and street) using the **Google Geocoding API** in combination with **FlutterFlow's Global Properties**.
+
+
+
+:::info[Prerequisites]
+- A **FlutterFlow project** with location permissions enabled.
+- A valid **Google Maps API Key** with access to the Geocoding API.
+:::
+
+Follow the steps below:
+
+1. **Enable Google Maps API Access**
+
+ Make sure your project has a valid Google Maps API Key.
+
+ - If you’ve already configured Google Maps, you can reuse the existing key.
+ - Follow the setup guide under **FlutterFlow > Settings > Google Maps** if you haven’t set it up yet.
+
+ 
+
+2. **Set Up the API Call**
+
+ Use the following endpoint for Google’s Geocoding API:
+
+ ```
+ https://maps.googleapis.com/maps/api/geocode/json
+ ```
+
+ Create a new API Call named `Geocoding` with the following parameters:
+
+ - `latlng` (String) – the device’s current location in the format `latitude,longitude`
+ - `key` (String) – your Google Maps API Key
+
+ Example URL with parameters:
+
+ ```
+ https://maps.googleapis.com/maps/api/geocode/json?latlng=[latlng]&key=[key]
+ ```
+
+ 
+
+3. **Create a Custom Function to Format LatLng**
+
+ To pass the current device location as a string, create a custom function that converts the `LatLng` value into a comma-separated string.
+
+ ```dart
+ return (latlang.latitude.toString() + ',' + latlang.longitude.toString());
+ ```
+
+ 
+
+ 
+
+ This function uses the `Global Properties > Current Device Location` and converts it into the required string format.
+
+4. **Call the API and Display the Response**
+
+ Trigger the API call on **Page Load** or an **Action**, passing:
+
+ - `latlng`: Output of the custom function.
+ - `key`: Your Google API Key (can be stored securely in a user record or environment variable).
+
+ 
+
+5. **Show the Address in a Text Widget**
+
+ Bind a `Text` widget to display the API response using the appropriate response field.
+
+ For example, to show the formatted address:
+
+ ```text
+ response.results[0].formatted_address
+ ```
+
+ 
+
+ You can extract additional details such as country, city, or postal code from other fields in the response.
+
+ :::tip
+ To store the result for later use, use the **Set from Variable** action and save the address to Firestore or Local State.
+ :::
+
+ :::note
+ - You can also trigger this logic during signup, checkout, or any workflow where location-based personalization is needed.
+ - For complex use cases, parse the full JSON and extract relevant parts of the location using the **Response & JSON Paths** tools in the API call editor.
+ :::
diff --git a/docs/resources/control-flow/backend-logic/api/API Call Error Handling..md b/docs/resources/control-flow/backend-logic/api/API Call Error Handling..md
new file mode 100644
index 00000000..46cfa016
--- /dev/null
+++ b/docs/resources/control-flow/backend-logic/api/API Call Error Handling..md
@@ -0,0 +1,114 @@
+---
+keywords: ['api', 'error', 'call']
+slug: /handle-api-call-errors
+title: Handle API Call Errors
+---
+
+# Handle API Call Errors
+
+Proper error handling in API calls helps ensure reliable app behavior and a better user experience. This guide walks through how to manage different API response outcomes in FlutterFlow.
+
+:::info[Prerequisites]
+- A configured API call in your project.
+- Basic understanding of FlutterFlow actions and variables.
+:::
+
+## Step 1: Add the API Call Action
+
+Start by adding the API call action to your desired trigger (e.g., a button press).
+
+:::note
+Ensure that you name the **Action Output Variable** when configuring the API call. This allows referencing the API response throughout the workflow.
+:::
+
+
+
+## Step 2: Check API Call Success Status
+
+Add a **Conditional Action** to determine if the call was successful.
+
+
+
+Select the output variable of the API call, then use the built-in boolean field `Succeeded`. This value is `true` if the API call succeeded.
+
+
+
+:::tip
+To handle specific failure cases, use the `Status Code` field in the condition. For example, check if the response returns a `400` status to handle a specific error scenario.
+:::
+
+
+
+
+## Step 3: Add Actions for API Failure
+
+If the call fails, display a message to the user. You can use a `Show SnackBar` action and include the status code in the message.
+
+
+
+Customize the fallback behavior as needed. You may choose to:
+- Show an alert dialog
+- Navigate to a fallback page
+- Retry the request
+
+## Step 4: Check If the Response Is Valid
+
+Sometimes an API returns a `200 OK` status but the response body is not usable due to incorrect input (e.g., an invalid API key).
+
+
+
+
+In this example, the call succeeds but returns no useful data. To handle this:
+
+1. Add another conditional action after confirming success.
+2. Check whether a key path in the response (e.g., `full_address`) is set.
+
+
+
+
+Use the “Set / Not Set” condition to verify that expected fields contain data. Based on this, take appropriate follow-up actions.
+
+:::warning
+APIs behave differently—some always return a success code even when there's an error. Always validate the content of your response, not just the status.
+:::
+
+## Step 5: Handle Valid and Invalid Responses
+
+If the expected path is set, proceed with displaying or using the data.
+
+
+
+If it is not set, display the entire response body for debugging purposes. This can help identify root issues such as authentication errors or misconfigured paths.
+
+## Example Flow
+
+Here is an example of a complete action flow for error handling:
+
+
+
+This flow ensures:
+- The call status is checked.
+- The response body is validated.
+- Appropriate feedback is shown to the user in every scenario.
+
+## Output Scenarios
+
+### Failed API Call (e.g., 400 Error)
+
+
+
+Displays the error code and allows further investigation.
+
+### Success Call with Invalid Response
+
+
+
+Shows a fallback message or error details if expected data is missing.
+
+### Success Call with Valid Data
+
+
+
+Data is used with confidence, and the app behaves as expected.
+
+
diff --git a/docs/resources/control-flow/backend-logic/backend-query/query-collection.md b/docs/resources/control-flow/backend-logic/backend-query/query-collection.md
index 37db013e..5c14d979 100644
--- a/docs/resources/control-flow/backend-logic/backend-query/query-collection.md
+++ b/docs/resources/control-flow/backend-logic/backend-query/query-collection.md
@@ -176,4 +176,93 @@ Additionally, you can enable real-time updates when creating a new table.

-
\ No newline at end of file
+
+
+## Example: Filter One Dropdown by Another
+
+You can filter one dropdown based on the selected value of another. This is useful in nested selection scenarios like choosing a vehicle **make** first, then filtering the **model** dropdown accordingly.
+
+1. **Set Up Firestore Collections**
+
+ - **`make` Collection**
+ - Field: `name` (String) — the vehicle make (e.g., BMW)
+
+ - **`model` Collection**
+ - Fields:
+ - `name` (String) — model name
+ - `make_name` (String) — should match the `name` from the `make` collection
+
+2. **Create the Dropdown UI**
+
+ Add two `Dropdown` widgets:
+ - **First dropdown** → queries `make`
+ - **Second dropdown** → queries `model`, filtered by the selected `make`
+
+3. **Query the First Dropdown**
+
+ - Select the **first dropdown**
+ - Set the data source to a query on `make`
+ - Bind the `name` field to the dropdown options
+
+4. **Filter the Second Dropdown**
+
+ - Select the **second dropdown**
+ - Set its data source to query the `model` collection
+ - Add a filter:
+ - **Field**: `make_name`
+ - **Condition**: `is equal to`
+ - **Value**: the selected item from the first dropdown (via `Widget State`)
+
+ :::tip
+ This method can be extended to chains of 3+ dropdowns using additional filters.
+ :::
+
+## Example: Filter Records by Selected Calendar Date
+
+You can use a `Calendar` widget to dynamically filter query results by date. This is useful when showing time-sensitive records such as appointments or events.
+
+:::info[Requirements]
+- A Firebase collection with a date field (e.g., `eventDate`)
+- A `Calendar` widget on the page
+- A `ListView` bound to a Firebase query
+:::
+
+1. **Add Date Filters to the Query**
+
+ Apply two filters to your `ListView` query:
+
+ - **Start of the day** – `eventDate` **≥** selected date (start)
+ - **End of the day** – `eventDate` **≤** selected date (end)
+
+ Steps:
+
+ 1. Select the `ListView` widget.
+ 2. In the **Backend Query** section, click **+ Filter** twice.
+ 3. For both filters, use:
+ - **Field Name**: `eventDate`
+ - **Relation**:
+ - First filter: `Greater Than or Equal`
+ - Second filter: `Less Than or Equal`
+ - **Value Source**: `From Variable` → `Widget State` → `calendarSelectedDay`
+ - Set **Range Part**:
+ - First filter: `Start`
+ - Second filter: `End`
+
+2. **Set the Initial Calendar Date**
+
+ To avoid loading issues:
+
+ 1. Select the `Calendar` widget.
+ 2. Under **Initial Date**, choose:
+ - **Source**: `Global Properties`
+ - **Option**: `Current Timestamp`
+
+ :::warning
+ Not setting an initial date can lead to a blank screen in Run Mode.
+ :::
+
+**Test the Result:**
+
+ - Run the app.
+ - Select a date on the calendar.
+ - The `ListView` will update to show only records from that date.
From 124e3576663128e0aa7d7fd4c47f431d716750eb Mon Sep 17 00:00:00 2001
From: mrdavidorok
Date: Thu, 7 Aug 2025 01:15:46 +0100
Subject: [PATCH 2/2] updated content: placed examples before FAQs. Removed
repeated articles. updated assest
---
.../adding-customization/build-iot-app.md | 54 --------
.../advanced}/custom-login-routing.md | 31 +++--
.../advanced/imgs/20250430121414406250.png | Bin 0 -> 208115 bytes
.../advanced/imgs/20250430121414639307.png | Bin 0 -> 49477 bytes
.../advanced/imgs/20250430121414890408.png | Bin 0 -> 201668 bytes
.../advanced/imgs/20250430121415192057.png | Bin 0 -> 42303 bytes
.../advanced/imgs/20250430121415472919.png | Bin 0 -> 143089 bytes
.../advanced/imgs/20250430121434550471.png | Bin 0 -> 138545 bytes
.../advanced/imgs/20250430121434823464.png | Bin 0 -> 151967 bytes
.../advanced/imgs/20250430121435145067.png | Bin 0 -> 200763 bytes
.../advanced/imgs/20250430121435792377.png | Bin 0 -> 194012 bytes
.../advanced/imgs/20250430121436144376.png | Bin 0 -> 240169 bytes
.../advanced/imgs/20250430121436460665.png | Bin 0 -> 162514 bytes
.../advanced/imgs/20250430121436751661.png | Bin 0 -> 156291 bytes
.../advanced/imgs/20250430121437067417.png | Bin 0 -> 292970 bytes
.../animation_gifs/20250430121406506215.gif | Bin 0 -> 981473 bytes
.../animation_gifs/20250430121406885071.png | Bin 0 -> 339021 bytes
.../animation_gifs/20250430121407233519.png | Bin 0 -> 147477 bytes
.../animation_gifs/20250430121407654843.png | Bin 0 -> 209919 bytes
.../animation_gifs/20250430121407938780.png | Bin 0 -> 183236 bytes
.../animation_gifs/20250430121408203472.gif | Bin 0 -> 1527090 bytes
.../animations/custom-loading-bottom-sheet.md | 12 +-
.../custom-navbar-setup.md | 10 +-
.../imgs/20250430121318472792.gif | Bin 0 -> 542524 bytes
.../imgs/20250430121449657102.png | Bin 0 -> 348282 bytes
.../imgs/20250430121450015102.png | Bin 0 -> 241909 bytes
.../imgs/20250430121450326812.png | Bin 0 -> 387875 bytes
.../imgs/20250430121450591399.png | Bin 0 -> 52291 bytes
.../imgs/20250430121450801118.png | Bin 0 -> 21167 bytes
.../pageview-widget.md | 104 +++++++-------
.../supabase/imgs/20250430121159260138.png | Bin 0 -> 162739 bytes
.../supabase/imgs/20250430121159528641.png | Bin 0 -> 266218 bytes
.../supabase/imgs/20250430121159842724.png | Bin 0 -> 97716 bytes
.../supabase/imgs/20250430121200086333.png | Bin 0 -> 82785 bytes
.../supabase/imgs/20250430121200394549.png | Bin 0 -> 173677 bytes
.../supabase-search-implementation.md | 11 +-
.../retrieve-device-location-address.md | 94 -------------
.../api/API Call Error Handling..md | 114 ---------------
.../api/handle-api-call-errors.md | 117 ++++++++++++++++
.../api/imgs/20250430121338595755.png | Bin 0 -> 380918 bytes
.../api/imgs/20250430121338981199.png | Bin 0 -> 393268 bytes
.../api/imgs/20250430121339304862.png | Bin 0 -> 133586 bytes
.../api/imgs/20250430121339561161.png | Bin 0 -> 600227 bytes
.../api/imgs/20250430121339880626.png | Bin 0 -> 174202 bytes
.../api/imgs/20250430121340184264.png | Bin 0 -> 259517 bytes
.../api/imgs/20250430121340477997.png | Bin 0 -> 191640 bytes
.../api/imgs/20250430121340819210.png | Bin 0 -> 118960 bytes
.../api/imgs/20250430121341094142.png | Bin 0 -> 130585 bytes
.../api/imgs/20250430121341370572.png | Bin 0 -> 110425 bytes
.../api/imgs/20250430121341663566.png | Bin 0 -> 144631 bytes
.../api/imgs/20250430121341984539.png | Bin 0 -> 59543 bytes
.../api/imgs/20250430121342448092.png | Bin 0 -> 44813 bytes
.../api/imgs/20250430121342680195.png | Bin 0 -> 46092 bytes
.../api/imgs/20250430121342877952.png | Bin 0 -> 44256 bytes
.../api/imgs/20250430121343302322.gif | Bin 0 -> 5098556 bytes
.../backend-query/query-collection.md | 131 +++++++++---------
56 files changed, 271 insertions(+), 407 deletions(-)
delete mode 100644 docs/ff-concepts/adding-customization/build-iot-app.md
rename docs/{ff-integrations/authentication => ff-concepts/advanced}/custom-login-routing.md (85%)
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121414406250.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121414639307.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121414890408.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121415192057.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121415472919.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121434550471.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121434823464.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121435145067.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121435792377.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121436144376.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121436460665.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121436751661.png
create mode 100644 docs/ff-concepts/advanced/imgs/20250430121437067417.png
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121406506215.gif
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121406885071.png
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121407233519.png
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121407654843.png
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121407938780.png
create mode 100644 docs/ff-concepts/animations/animation_gifs/20250430121408203472.gif
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121318472792.gif
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121449657102.png
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121450015102.png
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121450326812.png
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121450591399.png
create mode 100644 docs/ff-concepts/navigation-routing/special-page-navigation/imgs/20250430121450801118.png
create mode 100644 docs/ff-integrations/database/supabase/imgs/20250430121159260138.png
create mode 100644 docs/ff-integrations/database/supabase/imgs/20250430121159528641.png
create mode 100644 docs/ff-integrations/database/supabase/imgs/20250430121159842724.png
create mode 100644 docs/ff-integrations/database/supabase/imgs/20250430121200086333.png
create mode 100644 docs/ff-integrations/database/supabase/imgs/20250430121200394549.png
delete mode 100644 docs/ff-integrations/maps/google-maps/retrieve-device-location-address.md
delete mode 100644 docs/resources/control-flow/backend-logic/api/API Call Error Handling..md
create mode 100644 docs/resources/control-flow/backend-logic/api/handle-api-call-errors.md
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121338595755.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121338981199.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121339304862.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121339561161.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121339880626.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121340184264.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121340477997.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121340819210.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121341094142.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121341370572.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121341663566.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121341984539.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121342448092.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121342680195.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121342877952.png
create mode 100644 docs/resources/control-flow/backend-logic/api/imgs/20250430121343302322.gif
diff --git a/docs/ff-concepts/adding-customization/build-iot-app.md b/docs/ff-concepts/adding-customization/build-iot-app.md
deleted file mode 100644
index cba58a3a..00000000
--- a/docs/ff-concepts/adding-customization/build-iot-app.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-keywords: ['iot', 'bluetooth', 'mqtt', 'flutter packages']
-slug: /build-iot-app
-title: Build an IoT App
----
-
-# Build an IoT App
-
-An IoT (Internet of Things) app is designed to connect, monitor, and control smart devices such as sensors, thermostats, and Bluetooth-enabled devices. With FlutterFlow, it’s possible to build the front-end of an IoT app and extend its capabilities using custom code and Flutter packages.
-
-:::info[Prerequisites]
-- Familiarity with FlutterFlow’s Custom Code feature.
-- Access to target IoT devices or a simulation environment.
-- Understanding of device communication protocols such as Bluetooth or MQTT.
-:::
-
-1. **Set Up the Flutter App Structure**
-
- Use FlutterFlow’s UI builder to create the structure of your IoT app. Common pages include:
- - Device List
- - Device Control Panel
- - Settings and Connectivity
-
-2. **Integrate Custom Code or Packages**
-
- FlutterFlow supports using custom Dart code and Flutter packages. You can use this to manage device connectivity and communication.
-
- :::note
- To use external packages, you must add them via **Custom Code > Packages** in your project settings.
- :::
-
- Popular Flutter packages for IoT functionality include:
-
- - `flutter_blue`: Connect to and communicate with Bluetooth Low Energy (BLE) devices.
- - `iot_sensors`: Access common sensor data such as temperature, humidity, and acceleration.
- - `mqtt_client`: Communicate with MQTT brokers, a common protocol in IoT systems.
- - `flutter_mqtt`: Publish and subscribe to MQTT messages from within your app.
-
-3. **Manage Device Connections and State**
-
- Use custom actions and logic to:
- 1. Scan for available devices.
- 2. Connect or disconnect from a device.
- 3. Read or write values (e.g., sensor data, device commands).
- 4. Display real-time device states using local state or Firestore sync.
-
-4. **Test on Physical Devices**
-
- IoT features such as Bluetooth or MQTT often require testing on real hardware. Simulators or emulators may not support these protocols.
-
- :::warning
- FlutterFlow's custom code executes only on physical devices or when building for mobile. Make sure to test using real devices for Bluetooth or sensor-related features.
- :::
-
diff --git a/docs/ff-integrations/authentication/custom-login-routing.md b/docs/ff-concepts/advanced/custom-login-routing.md
similarity index 85%
rename from docs/ff-integrations/authentication/custom-login-routing.md
rename to docs/ff-concepts/advanced/custom-login-routing.md
index f43d0fe9..4443871b 100644
--- a/docs/ff-integrations/authentication/custom-login-routing.md
+++ b/docs/ff-concepts/advanced/custom-login-routing.md
@@ -31,8 +31,9 @@ This article explains how to configure custom routing logic for users after they
The **Persist** setting retains the value locally on the device until the app is uninstalled. It will reset on every refresh when testing in a web browser.
:::
- 
- 
+ 
+
+ 
**Add a User Field for Admin Check**
@@ -41,8 +42,9 @@ This article explains how to configure custom routing logic for users after they
This allows conditional routing based on the admin role.
- 
- 
+ 
+
+ 
**Configure Initial Pages**
@@ -56,7 +58,7 @@ This article explains how to configure custom routing logic for users after they
**Logged In Page** is used when a user is already authenticated.
:::
- 
+ 
**Define Actions on the Checkup Page**
@@ -69,9 +71,11 @@ This article explains how to configure custom routing logic for users after they
- If `FALSE`:
- Add action: **Navigate To** `LoginPage`, disable **Back Navigation**, then **Add Terminate**.
- 
- 
- 
+ 
+
+ 
+
+ 
2. **Check If User Is New (First Time Login)**
@@ -81,7 +85,7 @@ This article explains how to configure custom routing logic for users after they
- If `TRUE`:
- Add action: **Navigate To** `OnboardingPage`, disable **Back Navigation**, then **Add Terminate**.
- 
+ 
3. **Check If User Is an Admin**
@@ -94,7 +98,7 @@ This article explains how to configure custom routing logic for users after they
- If `FALSE`:
- Navigate to `UserHomePage`, disable back navigation, then **Terminate**.
- 
+ 
**Update `firstTime` After Onboarding**
@@ -105,8 +109,9 @@ This article explains how to configure custom routing logic for users after they
3. Add action: **Update Local State** > `firstTime` → set value → `False`.
4. Add navigation: **Navigate To** `CheckupPage`, disable back navigation.
- 
- 
+ 
+
+ 
:::tip
You can reuse the `CheckupPage` to add more advanced routing conditions, such as checking if the user has completed their profile or enabled certain settings.
@@ -114,5 +119,5 @@ You can reuse the `CheckupPage` to add more advanced routing conditions, such as
To skip onboarding for admins as well, extend your logic by nesting onboarding logic inside the admin check condition.
-
+
diff --git a/docs/ff-concepts/advanced/imgs/20250430121414406250.png b/docs/ff-concepts/advanced/imgs/20250430121414406250.png
new file mode 100644
index 0000000000000000000000000000000000000000..b72610173b99c71db347d629bf36c813fe165620
GIT binary patch
literal 208115
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