Skip to content

Commit 15499f2

Browse files
authored
Merge branch 'main' into david/firebase-issues
2 parents 2697fc5 + b14445e commit 15499f2

File tree

114 files changed

+3407
-454
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+3407
-454
lines changed
137 KB
Loading
128 KB
Loading

docs/accounts-billing/new-pricing-comparison.md

Lines changed: 757 additions & 0 deletions
Large diffs are not rendered by default.

docs/accounts-billing/plan-pricing.md

Lines changed: 571 additions & 4 deletions
Large diffs are not rendered by default.

docs/ff-concepts/adding-customization/code-file.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,16 @@ You need to create an instance of a class so you can work with actual data and u
139139
);
140140
```
141141

142-
- You can reuse the same class structure multiple times with different review data.
142+
- In FlutterFlow, you will store the instance of the custom class in the [state variables](../../ff-concepts/state-management/state-variables.md#state-variables) of your app, page, or component.
143+
- You can create multiple instances of the same class, reusing the same structure multiple times, each with different review data.
143144

144145
When you create an instance of a class, you can:
145146

146147
- Store actual review details.
147148
- Access and update the fields (e.g., `review1.rating` or `review1.comment`).
148149
- Call methods that do something with that data (e.g., `review1.markHelpful()` or `review1.shortComment()`).
149150

150-
To create an instance of a custom class, open the **Set from Variable** dialog and select **Create Custom Class Instance**. Choose the class you want to use, then select the class name from the **Constructor** dropdown. After that, set values for each of the required fields.
151+
To create an instance of a custom class, first you need to [create a state variable](../../ff-concepts/state-management/state-variables.md#creating-state-variables) (of type Custom Class) that will hold the instance. Then, to create and add the instance to the state variable, open the **Set from Variable** dialog and select **Create Custom Class Instance**. Choose the class you want to use, then select the class name from the **Constructor** dropdown. After that, set values for each of the required fields.
151152

152153

153154
<div style={{
@@ -412,7 +413,15 @@ Use the **Call Static Method** action to run a static method of your class. For
412413
413414
Similar to how you add a custom class, you can also add Custom Enums in your app. [Enums](../../resources/data-representation/enums.md) are a great way to define a fixed set of values, such as user roles, order statuses, or content types. Once parsed, these enums become available throughout your app and can be used in dropdowns, conditionals, and UI bindings.
414415
415-
For example, you could define an enum called `ReviewStatus` with values like `pending`, `approved`, and `rejected`.
416+
For example, you could define an enum called `ReviewStatus` with values like `pending`, `approved`, and `rejected`. Here's the code snippet for it:
417+
418+
```jsx
419+
enum ReviewStatus {
420+
pending,
421+
approved,
422+
rejected,
423+
}
424+
```
416425

417426
![custom-enums.avif](imgs/custom-enums.avif)
418427

docs/ff-concepts/navigation-routing/deep-dynamic-linking.md

Lines changed: 134 additions & 36 deletions
Large diffs are not rendered by default.

docs/ff-integrations/maps/google-maps/google-maps-widget.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ description: Learn how to add and configure the Google Maps widget in your Flutt
55
tags: [Google Maps, Widget, Integration]
66
sidebar_position: 2
77
keywords: [FlutterFlow, Google Maps, Widget, Integration]
8+
toc_max_heading_level: 4
89
---
10+
import Tabs from '@theme/Tabs';
11+
import TabItem from '@theme/TabItem';
912

1013
# Google Maps Widget
1114

@@ -155,6 +158,70 @@ the Map**.
155158
<div class="video-container"><iframe src="https://www.loom.
156159
com/embed/1b06bfc1365f4fc68f15089d4f84d798?sid=ff33ea94-cd7f-4b4e-822e-6fe0743dbd27" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
157160

161+
#### Map Takes Gesture Preference
162+
When this is turned on, any gestures, such as zooming or dragging, will only affect the map, not the rest of the page. This is helpful if your map is inside a scrollable page, so users can interact with the map without accidentally scrolling the whole page.
163+
164+
:::info
165+
This setting is only available if **Allow Interacting** and **Allow Zooming** are turned on.
166+
:::
167+
168+
<Tabs>
169+
<TabItem value="1" label="Map Takes Gesture Preference (Disabled)" default>
170+
<div style={{
171+
position: 'relative',
172+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
173+
height: 0,
174+
width: '100%'}}>
175+
<iframe
176+
src="https://demo.arcade.software/JC6AnbIQpfSPfENrbd6s?embed&show_copy_link=true"
177+
title=""
178+
style={{
179+
position: 'absolute',
180+
top: 0,
181+
left: 0,
182+
width: '100%',
183+
height: '100%',
184+
colorScheme: 'light'
185+
}}
186+
frameborder="0"
187+
loading="lazy"
188+
webkitAllowFullScreen
189+
mozAllowFullScreen
190+
allowFullScreen
191+
allow="clipboard-write">
192+
</iframe>
193+
</div>
194+
<p></p>
195+
</TabItem>
196+
<TabItem value="2" label="Map Takes Gesture Preference (Enabled)">
197+
<div style={{
198+
position: 'relative',
199+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
200+
height: 0,
201+
width: '100%'}}>
202+
<iframe
203+
src="https://demo.arcade.software/m5EdLhn4tlkjfRhhquqg?embed&show_copy_link=true"
204+
title=""
205+
style={{
206+
position: 'absolute',
207+
top: 0,
208+
left: 0,
209+
width: '100%',
210+
height: '100%',
211+
colorScheme: 'light'
212+
}}
213+
frameborder="0"
214+
loading="lazy"
215+
webkitAllowFullScreen
216+
mozAllowFullScreen
217+
allowFullScreen
218+
allow="clipboard-write">
219+
</iframe>
220+
</div>
221+
<p></p>
222+
</TabItem>
223+
</Tabs>
224+
158225
### Show User Location
159226

160227
When enabled, a blue dot appears on the map to indicate the user's current location. If the map is
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
---
2+
slug: /resources/forms/form-triggers
3+
title: Form Triggers
4+
tags: [Form, Actions, Triggers]
5+
keywords: [FlutterFlow, Form Triggers, User Interactivity, Dropdown, Slider, Toggle, TextField, On Selected, On Toggled, On Change, On Focus Change]
6+
description: Learn how to use Form Triggers in FlutterFlow to create dynamic, interactive user experiences by responding to user input on widgets like dropdowns, sliders, toggles, and text fields.
7+
sidebar_position: 4
8+
---
9+
10+
# Form Triggers
11+
12+
**Form Triggers** in FlutterFlow allow you to respond dynamically to user input on widgets like dropdowns, sliders, toggles, and text fields. Whether it’s selecting an option, toggling a switch, or typing in a field, these triggers help you create interactive, responsive experiences by executing actions based on user interaction.
13+
14+
## On Selected
15+
16+
The **On Selected** action trigger is used to perform actions when a user selects or changes a value from a widget that presents multiple options. This trigger is associated with form widgets where selection input is required, such as [Dropdown](form-widgets/dropdown.md), [RadioButton](form-widgets/radiobutton.md), [CheckboxGroup](form-widgets/checkbox.md#checkboxgroup), [ChoiceChips](form-widgets/choicechips.md), and [Slider](../../../ui/widgets/built-in-widgets/slider.md).
17+
18+
:::tip[Possible use cases]
19+
20+
- **Dropdown – Shipping Method Selection:** User selects a shipping method from options like "Standard", "Express", or "Next Day". Action under the *On Selected* trigger sets the app state variable `shippingOption`, which updates pricing or estimated delivery time dynamically.
21+
- **Slider – Show Volume Level in Snackbar:** User adjusts a Slider from 0 to 100. The *On Selected* trigger displays a Snackbar showing the current volume: Volume set to: [sliderValue].
22+
- **ChoiceChips – Filter Products by Category:** User taps a chip like "All", "Electronics", or "Clothing". The *On Selected* trigger might set an app state variable (e.g., `selectedCategory`) and update the product list to match the chosen category.
23+
24+
:::
25+
26+
To use the **On Selected** trigger:
27+
28+
1. Start by selecting a supported widget, such as a Dropdown.
29+
2. Open the **Actions** tab in the properties panel and click **+ Add Action**.
30+
3. You will notice that the **Type of Action** (aka callback) is already set to **On Selected**. That means actions added under this will be called whenever the selection changes.
31+
4. Finally, define the actions you want to perform when the user makes a selection, such as setting a variable, navigating to another page, or displaying a message.
32+
33+
![on-selected](imgs/on-selected.avif)
34+
35+
## On Toggled On / On Toggled Off
36+
37+
The **On Toggled On** and **On Toggled Off** action triggers are used to perform actions when a user turns a toggleable widget on or off. These triggers are supported by widgets such as [Checkbox](form-widgets/checkbox.md), [CheckboxListTile](form-widgets/checkbox.md#checkboxlisttile), [Switch](form-widgets/switch.md), and [SwitchListTile](form-widgets/switch.md#switchlisttile), any widget that represents a binary state.
38+
39+
These triggers are especially useful when you want to conditionally execute different actions based on whether a user enables or disables a setting, preference, or feature.
40+
41+
:::tip[Possible use cases]
42+
43+
- **Switch – Enable Dark Mode:** User toggles a Switch to enable Dark Mode. Action under the *On Toggled On* trigger sets the dark mode.
44+
- **Checkbox – Agree to Terms:** User checks a Checkbox labeled “I agree to the terms and conditions.” The *On Toggled On* trigger enables the Submit button. If the user unchecks it, the *On Toggled Off* trigger disables the button again.
45+
- **CheckboxListTile – Select Notification Channels:** User checks or unchecks options like Email, SMS, or Push Notifications. Each toggle fires either *On Toggled O*n or *On Toggled Off* to update selected preferences in the backend.
46+
47+
:::
48+
49+
To use the **On Toggled On** or **On Toggled Off** trigger:
50+
51+
1. Start by selecting a supported widget, such as a Switch.
52+
2. Open the **Actions** tab in the properties panel and click **+ Add Action**.
53+
3. Choose **On Toggled On** to define actions when the toggle is switched on, or **On Toggled Off** to define actions when it's switched off.
54+
4. Add your desired actions, such as updating a variable, showing a message, enabling a button, or triggering a backend call.
55+
56+
![on-toggle](imgs/on-toggle.avif)
57+
58+
## On Change
59+
60+
The **On Change** action trigger is used to respond to real-time user input as they type or modify the contents of an input field. This trigger is supported by widgets such as [TextField](form-widgets/text-field.md) and [Pincode](../../../ui/widgets/built-in-widgets/pincode.md).
61+
62+
It’s ideal for enabling live form validations, updating app state as the user types, or enabling/disabling UI elements based on the current input.
63+
64+
:::tip[Possible use cases]
65+
66+
- **TextField – Enable Button When Email Is Entered:** As the user types in an email TextField, action under the *On Change* trigger checks if the input is a valid email. If it is, it enables the Continue button.
67+
- **Pincode – Auto Submit When Complete:** When a user finishes entering a 6-digit code in a Pincode widget, action under the *On Change* trigger checks if the full code is entered and triggers form submission or a backend call.
68+
69+
:::
70+
71+
To use the **On Change** trigger:
72+
73+
1. Start by selecting a supported widget, such as a TextField.
74+
2. Open the **Actions** tab in the properties panel and click **+ Add Action**.
75+
3. Choose **On Change** from the list of available triggers.
76+
4. Define the actions to trigger, such as setting a variable, showing a message, or calling an API.
77+
78+
![on-change](imgs/on-change.avif)
79+
80+
---
81+
82+
## On Focus Change
83+
84+
The **On Focus Change** trigger fires whenever an input field gains or loses focus, like when a user taps into or out of a [TextField](form-widgets/text-field.md) and [Pincode](../../../ui/widgets/built-in-widgets/pincode.md) widget. It’s useful for providing user guidance (on focus) or performing validations.
85+
86+
:::tip[Possible use cases]
87+
88+
- **TextField – Show Hint on Focus:** When the TextField gains focus, action under the *On Focus Change* trigger displays a helper text or tooltip with input instructions (e.g., “Enter your phone number without dashes”).
89+
- **Pincode – Validate on Exit:** When the user finishes entering the code and the Pincode widget loses focus, action under the *On Focus Change* trigger runs validation logic to check if the input is complete or valid, and displays an error if it's not.
90+
91+
:::
92+
93+
To use the **On Focus Change** trigger:
94+
95+
1. Start by selecting a supported widget, such as a TextField.
96+
2. Open the **Actions** tab in the properties panel and click **+ Add Action**.
97+
3. Choose **On Focus Change** from the list of available triggers.
98+
4. Define the actions to trigger, such as showing helper text, validating input, or updating the UI based on focus.
99+
100+
![on-focus-change](imgs/on-focus-change.avif)

docs/resources/control-flow/user-interactivity/forms/form-widgets/checkbox.md

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ Here is a simple way to do it:
7777
</div>
7878
<p></p>
7979

80-
### Setting initial value
80+
81+
### Setting Initial Value
8182

8283
You might want to show the checkbox with a default value, either check or uncheck. For example, showing the checked checkbox for travel insurance.
8384

@@ -112,45 +113,9 @@ To set the initial value:
112113
</div>
113114
<p></p>
114115

115-
### Saving checkbox value
116-
117-
You might want to save the checkbox's value as soon as it is checked or unchecked. For example, saving in an app state variable or Firestore document field. You can do so by adding the action on the checkbox widget.
118-
119-
The checkbox widget provides you with the following types of actions (aka callbacks), and you can choose any of them to add actions under it.
120-
121-
1. **On Toggled On**: Actions added under this will be triggered whenever the checkbox is selected/checked.
122-
2. **On Toggled Off**: Actions added under this will be triggered whenever the checkbox is unselected/unchecked.
116+
### Saving Checkbox Value
123117

124-
Here's how you do it:
125-
126-
1. Select the **Checkbox** widget, select **Actions** from the Properties panel (the right menu), and click **Open**. This will open an **Action Flow Editor** in a new popup window.
127-
2. Select **On Toggled On** or **On Toggled Off** and add an action that will update the value. (e.g., [update app state](../../../../../resources/data-representation/app-state.md#update-app-state-action), [update Firestore record](../../../../../ff-integrations/database/cloud-firestore/firestore-actions.md), etc.)
128-
129-
<div style={{
130-
position: 'relative',
131-
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
132-
height: 0,
133-
width: '100%'}}>
134-
<iframe
135-
src="https://demo.arcade.software/O8U6Xv5IbVwH9qDwVVfV?embed&show_copy_link=true"
136-
title=""
137-
style={{
138-
position: 'absolute',
139-
top: 0,
140-
left: 0,
141-
width: '100%',
142-
height: '100%',
143-
colorScheme: 'light'
144-
}}
145-
frameborder="0"
146-
loading="lazy"
147-
webkitAllowFullScreen
148-
mozAllowFullScreen
149-
allowFullScreen
150-
allow="clipboard-write">
151-
</iframe>
152-
</div>
153-
<p></p>
118+
You may want to immediately save the checkbox’s value when it is checked or unchecked. To do this, [add an action using the trigger](../../forms/form-triggers.md#on-toggled-on--on-toggled-off) that responds to changes in the widget’s selection.
154119

155120
### Customizing
156121

@@ -310,7 +275,11 @@ Here's an example of how you can use the CheckboxGroup widget in your project:
310275
</div>
311276
<p></p>
312277

313-
### Setting initial selection
278+
### Trigger Action on Change
279+
280+
See how to [trigger an action when a selection changes](../../forms/form-triggers.md#on-selected) on this widget.
281+
282+
### Setting Initial Selection
314283

315284
Sometimes you might want to display the CheckboxGroup with some options already selected. For example, selecting the topping options that are already served with Pizza itself. You can do so by setting the initial selection for the CheckboxGroup.
316285

@@ -522,6 +491,3 @@ To customize the checkbox border:
522491
</div>
523492
<p></p>
524493

525-
:::info[Trigger action on change]
526-
See how to [**trigger an action when a selection changes**](../../../../ui/widgets/widget-commonalities.md#trigger-action-on-selection-change) on this widget.
527-
:::

docs/resources/control-flow/user-interactivity/forms/form-widgets/choicechips.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ To add the ChoiceChips widget to your app:
5252
</div>
5353
<p></p>
5454

55-
## Trigger action on change
55+
### Trigger Action on Change
5656

57-
See how to [trigger an action when a selection changes](../../../../../resources/ui/widgets/widget-commonalities.md#trigger-action-on-selection-change) on this widget.
57+
See how to [trigger an action when a selection changes](../../forms/form-triggers.md#on-selected) on this widget.
5858

59-
## Select or clear all choices [Action]
59+
## Select or Clear All Choices [Action]
6060

6161
Users may need to swiftly deselect all chips or choose all available choice chips at once. You can do so by adding the **Clear All/Select All** action.
6262

@@ -68,7 +68,7 @@ Before you add this action, ensure you [**allow multiselect**](#allow-multiselec
6868

6969
You can customize the appearance and behavior of this widget using the various properties available under the properties panel.
7070

71-
### Allow multiselect
71+
### Allow Multiselect
7272

7373
You might want to allow users to select multiple choices to filter the result.
7474

@@ -165,7 +165,7 @@ To add a space between the chips, you can use the **Chip Spacing** ad **Row Spac
165165
</div>
166166
<p></p>
167167

168-
### Align chips
168+
### Align Chips
169169

170170
When you have chips in multiple rows, you can align them using the **Alignment** property. This is similar to setting main axis alignment for the Row widget.
171171

@@ -195,7 +195,7 @@ When you have chips in multiple rows, you can align them using the **Alignment**
195195
</div>
196196
<p></p>
197197

198-
### Customizing selected and unselected chip style
198+
### Customizing Selected and Unselected Chip Style
199199

200200
Various properties under the **Selected Chip Style** and **Unselected Chip Style** section allow you to customize chips to match your design. Here's how you do it:
201201

0 commit comments

Comments
 (0)