Skip to content

Commit b063741

Browse files
committed
Merge branch 'refs/heads/main' into update-misc
2 parents 0799e82 + 7f524b8 commit b063741

File tree

23 files changed

+454
-211
lines changed

23 files changed

+454
-211
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ While FlutterFlow provides a wide range of pre-built components and functionalit
1414
times when you need to extend your app with custom logic or UI components that are not available out of the box.
1515
This is where writing custom code comes into play.
1616

17-
There are a few different ways to make custom code accessible in FlutterFLow:
17+
There are a few different ways to make custom code accessible in FlutterFlow:
1818

1919
* **[Custom Functions](custom-functions.md):** Custom Dart functions that can be used to set Widget or Action properties.
2020
* **[Custom Actions](custom-actions.md):** Custom Dart functions that can be triggered by [Action Triggers](https://docs.flutterflow.io/resources/functions/action-triggers/) or used as nodes in an [Action Flow](https://docs.flutterflow.io/resources/functions/action-flow-editor#action-flow-editor). These are usually `async` functions and are able to import [custom package dependencies](#adding-a-pubspec-dependency).
@@ -522,4 +522,4 @@ If any project errors related to packages arise, they will be displayed in both
522522
allow="clipboard-write">
523523
</iframe>
524524
</div>
525-
<p></p>
525+
<p></p>

docs/ff-concepts/design-system/design-system.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ Make sure you have the proper rights or licenses to use the icons in your applic
731731

732732
**Steps to Generate and Add Custom Icons**
733733

734-
1. Head over to the [iconmoon](https://icomoon.io/app/#/select).
734+
1. Head over to the [IcoMoon](https://icomoon.io/app/#/select).
735735
2. Import your custom icon (.svg) or select from the free icons set.
736736
3. Select the **Generate Font** tab.
737737
4. Click on the Settings button (gear icon) beside the download text on the bottom right side.
@@ -836,7 +836,7 @@ If you prefer watching a video tutorial, here is the guide for you:
836836

837837
Creating a theme for widgets ensures that your app looks consistent and has a cohesive design. The Theme widgets can be reused, making it easy to update the styles of your app. If you decide to change any property of the widget, such as color scheme or fonts, you can update the theme widget instead of going through every widget individually. This can save a lot of time and effort, especially in larger projects.
838838

839-
For example, creating theme widgets for different types of buttons such as 'primary_button', 'secondary_button', and 'tertairy_button' with specific attributes like width, color, icon, border radius, and padding. Then, these widgets can be directly added to a page or applied to an existing widget.
839+
For example, creating theme widgets for different types of buttons such as 'primary_button', 'secondary_button', and 'tertiary_button' with specific attributes like width, color, icon, border radius, and padding. Then, these widgets can be directly added to a page or applied to an existing widget.
840840

841841
### Adding theme widgets
842842

@@ -1000,4 +1000,4 @@ If you prefer watching a video tutorial, here's the one for you:
10001000
<details>
10011001
<summary>How is the theme widget different from creating a template and component?</summary>
10021002
<p>The Theme Widget allows you to customize the visual appearance of a single widget, whereas templates consist of multiple widgets that create a unique UI layout with a specific purpose. On the other hand, components are fully-featured custom widgets that combine multiple widgets and actions to complete a task.</p>
1003-
</details>
1003+
</details>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,9 @@ Use the link data from this callback to:
847847
- Load content from Firestore using a referenced ID.
848848
849849
850+
:::danger[Testing Deeplinks]
851+
It’s recommended to test deep links on a **physical device**, as link verification (especially for Universal Links or App Links) may not consistently work on emulators or simulators.
852+
:::
850853
851854
852855

docs/ff-concepts/navigation-routing/nav-overview.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ This action involves navigating to a new screen by pushing a new route onto the
6363

6464
**What Happens Under the Hood:**
6565

66-
- When you push a route, a new screen is placed on top of the current stack. This means the current screen is still in the stack but is not visible to the user.
66+
- When you push a route, a new screen is placed on top of the current stack. This means the previous screen is still in the stack but is not visible to the user.
6767
- The new screen becomes the active screen that the user interacts with.
6868

6969
:::info
7070

71-
Learn more about adding this action [**here**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-to-action).
71+
Learn more about adding this action in the [**page navigation guide**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-to-action).
7272

7373
:::
7474

@@ -83,7 +83,7 @@ This action involves navigating back to the previous screen by popping the curre
8383

8484
:::info
8585

86-
Learn more about adding this action [**here**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-back-action).
86+
Learn more about adding this action in the [**page navigation guide**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-back-action).
8787

8888
:::
8989

@@ -98,6 +98,6 @@ This action involves replacing the current route with a new route. Unlike pushin
9898
:::info
9999

100100
- This is useful when you want to prevent the user from navigating back to the previous screen.
101-
- This action is essentially the **Navigate To** action with the **Replace Route** option enabled. Learn more about adding this action [**here**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-to-action).
101+
- This action is essentially the **Navigate To** action with the **Replace Route** option enabled. Learn more about adding this action in the [**page navigation guide**](../../ff-concepts/navigation-routing/page-navigation.md#navigate-to-action).
102102

103-
:::
103+
:::

docs/ff-integrations/ai/ai-agents.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,15 @@ You can obtain your OpenAI API key from [**OpenAI API Keys**](https://platform.o
7676

7777
#### Request Options
7878

79-
Here, you specify the type of inputs users can send to the AI.
79+
Define the types of inputs users can send to the AI agent. You can enable one or more of the following options:
8080

81-
- **Text**: Allows users to send text-based messages.
82-
- **Image**: Enables image input, allowing the agent to analyze photos.
83-
- **Audio**: (Google Agent only) Allows to send audio messages or voice inputs.
84-
- **Video**: (Google Agent only) Allows users to send short video clips to analyze.
81+
- **Text**: Allows users to send written messages, questions, or prompts.
82+
- **Image**: Enables users to upload photos for the AI to analyze visual content, such as objects, styles, or scenes.
83+
- **PDF** (Anthropic and Google Agent only): Lets users submit PDF documents, allowing the AI to extract and interpret information from files like resumes, reports, or forms.
84+
- **Audio** (Google Agent only): Supports voice input, enabling users to record or upload audio clips for transcription, sentiment analysis, or voice-based commands.
85+
- **Video** (Google Agent only): Allows users to submit video files, enabling the AI to analyze visual elements.
8586

86-
Selecting multiple input types makes it easier for users to clearly communicate what they need. Instead of relying only on text descriptions, users can combine inputs—for example, uploading an image along with text to better illustrate their queries and help the agent provide more accurate responses.
87+
Selecting multiple input types makes it easier for users to clearly communicate what they need. Instead of relying only on text descriptions, users can combine inputs. For instance, in an AI Stylist agent, enabling both Text and Image allows users to either describe their outfits in words or upload clothing photos for personalized analysis.
8788

8889
#### Response Options
8990

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
---
2+
slug: /integrations/firebase-storage/storage-library
3+
title: Firebase Storage Library
4+
description: The Firebase Storage Library provides access to the files in Cloud Storage through the Firebase SDK beyond what FlutterFlow's built-in support provides.
5+
tags: [Firebase Storage, Cloud Storage, Integration, Library]
6+
sidebar_position: 2
7+
keywords: [FlutterFlow, Firebase Storage, Cloud Storage, Integration, Security]
8+
---
9+
10+
The [Firebase Storage Library][storage-library-item] provides access to the files in Cloud Storage through the Firebase SDK beyond what [FlutterFlow's built-in support](/concepts/file-handling) provides.
11+
12+
13+
[storage-library-item]: https://marketplace.flutterflow.io/item/Ec3NWw8sxqJ1tbriOIEE
14+
15+
## Instructions
16+
17+
To start using this library:
18+
19+
1. [Import the library](/resources/projects/libraries/#importing-a-library) into your existing FlutterFlow project.
20+
2. [Connect your FlutterFlow project to Firebase](/integrations/firebase/connect-to-firebase/) (if you haven't done so already).
21+
The library will default to using the default bucket of your associated Firebase project. You can override this behavior by passing an explicit bucket URL to any of the actions.
22+
3. [Use the Custom Actions](/concepts/custom-code/custom-actions/#using-a-custom-action) and Custom Functions in your Action Flows.
23+
24+
25+
### Custom actions
26+
27+
* `uploadFileToBucket` \- Upload a file to any path in any bucket that you have write access to.
28+
* **Parameters:**
29+
* The `bucketName` (`String?`) to upload the file to. If you leave this empty, it uses the default bucket of the associated Firebase project.
30+
* The `fullPath` (`String?`) where the file will be written to inside the bucket. If this is specified, the `prefix` parameter is ignored.
31+
* The `uploadedFile` (`FFUploadedFile`) that is to be uploaded to Cloud Storage. This is the action output of a previous `Store media for upload` action.
32+
* The `prefix` (folder/directory) (`String?`) where the file will be uploaded to. If `fullPath` is not specified, the action uses this parameter and the `name` of the `uploadedFile` to determine the full path where it writes the file.
33+
* **Action result:**
34+
* If successful, the action result is a `fileObject` containing the full path of the uploaded file.
35+
36+
* `listAllFilesInBucket` \- List all files in any bucket that you have read access to.
37+
* **Parameters:**
38+
* The `bucketName` (`String?`) to list the files from. If you leave this empty, it uses the default bucket of the associated Firebase project.
39+
* The `listType` (`StorageListType?`) of the items to list (files, directories, both). If left empty, the action will list both files and prefixes (folders/directories).
40+
* The `prefix` (`String?`) is the `/` separated path from which to list files. If left empty, the action will list the items in the root of the storage bucket.
41+
* **Action result:**
42+
* If successful, the action results in a `List` of `fileObject` elements.
43+
44+
* `downloadFile` \- Download the data for a file that you have read access to. This downloads the actual data into your application code. If you instead want a public URL to the data, use `getDownloadUrl` instead.
45+
* **Parameters:**
46+
* The `bucketName` (`String?`) to download the file from. If you leave this empty, it uses the default bucket of the associated Firebase project.
47+
* The `fullPath` (`String`) of the file whose data will be read from the bucket.
48+
* **Action result:**
49+
* If successful, the action result is an `FFUploadedFile` with the data of the file that was read from the bucket.
50+
51+
* `getDownloadUrl` \- Get the download URL for a file in a bucket that you have read access to. This URL then provides public, read-only access to the file
52+
* **Parameters:**
53+
* The `bucketName` (`String?`) that contains the file. If you leave this empty, it uses the default bucket of the associated Firebase project.
54+
* The `fullPath` (`String`) of the file for which to get the download URL.
55+
* **Action result:**
56+
* If successful, the action result is a HTTP URL that allows public access to the file.
57+
58+
* `getMetadataForFile` \- Get the metadata for a file in any bucket that you have read access to
59+
* **Parameters:**
60+
* The `bucketName` (`String?`) that contains the file. If you leave this empty, it uses the default bucket of the associated Firebase project.
61+
* The `fullPath` (`String`) of the file for which to get the download URL.
62+
* A**ction result:**
63+
* If successful, the action result is a `FullMetadata` with all the metadata and custom metadata of the file.
64+
65+
66+
* `updateMetadataForFile` \- Update the metadata for a file in any bucket that you have write access to
67+
* **Parameters:**
68+
* The `bucketName` (`String?`) that contains the file. If you leave this empty, it uses the default bucket of the associated Firebase project.
69+
* The `fullPath` (`String`) of the file for which to get the download URL.
70+
* The `metadata` (`SettableMetadata`) to write to the Cloud Storage bucket for the file. If any value is left out or empty in the metadata, it is left unmodified in Cloud Storage.
71+
* **Action result:**
72+
* If successful, the action result is a `FullMetadata` with all the metadata and custom metadata of the file after the update.
73+
74+
75+
* `getPathFromUrl` \- Get the path for a file based on its (https:// or gs://) URL. This is a synchronous call, as it doesn't require any call to the server.
76+
* **Parameters**
77+
* The `Url` to parse.
78+
* **Action result:**
79+
* The action result is a `fileObject` derived from the URL.
80+
81+
* `deleteFileFromBucket` \- Deletes a file from any bucket you have write access to.
82+
* **Parameters:**
83+
* The `bucketName` (`String?`) that contains the file. If you leave this empty, it uses the default bucket of the associated Firebase project.
84+
* The `fullPath` (`String`) of the file to delete from the bucket.
85+
* **Action result:**
86+
* If the action succeeds the file has been deleted. There is no additional information.
87+
88+
### Enums
89+
90+
* `StorageListType` is an enumeration of the types of items that the `listAllFilesInBucket` action can return. Values:
91+
* `files`: List only the files in the specified path.
92+
* `prefixes`: List only the prefixes in the specified path. You might more commonly refer to these as folders or directories, but since Cloud Storage doesn't actually have support for folders/directories, it uses `/` characters in the file names to emulate those and calls them prefixes.
93+
* `filesAndPrefixes`: List both files and prefixes in the specified path.
94+
95+
### Data Types
96+
97+
* `fileObject` \- the metadata for a file or prefix (folder/directory) in Cloud Storage. It has the following fields:
98+
* `fullPath` (`String`) \- The full path of the file/prefix inside the storage bucket. The value does not start with a leading `/`.
99+
* `isPrefix` (`Boolean`) \- Indicates whether the object is a file (`false`) or prefix (folder/directory) (`true`).
100+
101+
102+
* `FullMetadata` \- the full metadata of an item in a storage bucket as returned by `getMetadataForFile`, modelled after the [`FullMetadata` class in the Firebase SDK for Cloud Storage](https://pub.dev/documentation/firebase_storage/latest/firebase_storage/FullMetadata-class.html).
103+
* `SettableMetadata` \- the settable metadata of an item in a storage bucket, as passed to a call to `updateMetadataForFile`, modelled after the [`SettableMetadata` class in the Firebase SDK for Cloud Storage](https://pub.dev/documentation/firebase_storage/latest/firebase_storage/SettableMetadata-class.html).
104+
* `KeyValuePair` \- A `String`/`String` key/value pair as used for the `customMetadata` in the `FullMetadata` and `SettableMetadata` data types.

docs/generated-code/ff-app-state.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,14 @@ class FFAppState extends ChangeNotifier {
3434
notifyListeners();
3535
}
3636

37-
// App State variable of primitive type with a getter and setter
38-
bool _enableDarkMode = false;
37+
// App State variable of primitive type with a getter and setter
38+
bool _enableDarkMode = false;
3939

40-
bool get enableDarkMode => _enableDarkMode;
40+
bool get enableDarkMode => _enableDarkMode;
4141

42-
set enableDarkMode(bool value) {
42+
set enableDarkMode(bool value) {
4343
_enableDarkMode = value;
44-
}
45-
44+
}
4645
}
4746
```
4847

@@ -52,7 +51,7 @@ The `_enableDarkMode` is an App State variable created by developer that creates
5251
When updating an `AppState` variable from the Action Flow Editor, you will be presented with several **[update type](../resources/data-representation/app-state.md#update-type)** options such as **Rebuild All Pages**, **Rebuild Current Page**, and **No Rebuild** in the Action Settings. Let's see how the generated code changes when these options are selected.
5352

5453
### Rebuild Current Page
55-
When a developer chooses to update App State with the update type set to **Rebuild Current Page**, the corresponding `setter` is called. Immediately after, `setState((){});` is invoked, which updates only the current page.
54+
When a developer chooses to update App State with the update type set to **Rebuild Current Page**, the corresponding `setter` is called. Immediately after, `setState(() {});` is invoked, which updates only the current page.
5655

5756
Here's an example of the generated code when we update the App State `enableDarkMode` in the `onInitialization` action trigger of the `ProductListPage`.
5857

@@ -90,7 +89,7 @@ Only the setter is called with no setState or update method invoked afterward. T
9089
When you add an [**Update App State**](../resources/data-representation/app-state.md#update-app-state-action) action via the Action Flow Editor, the corresponding pages will include this line within the build method:
9190
9291
```js
93-
@override
92+
@override
9493
Widget build(BuildContext context) {
9594
context.watch<FFAppState>();
9695
...
@@ -155,4 +154,4 @@ These functions are automatically generated to provide a convenient and consiste
155154
156155
:::info[How to create App State variables]
157156
To learn more about creating and using App State variables in FlutterFlow's UI, check out the[ **App State**](../resources/data-representation/app-state.md) guide.
158-
:::
157+
:::

docs/intro/before-you-begin/app-architecture.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ This includes:
2222

2323
Backend usually refers to more complex logic and data storage. This includes:
2424

25-
- Setting up a database that is capabale of storing, sending and retrieving data
25+
- Setting up a database that is capable of storing, sending and retrieving data
2626
- Leveraging off-the-shelf services, like authentication providers or payment platforms
2727
- Defining business logic, either by writing code or using a low-code tool
2828

docs/intro/ff-ui/dashboard.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ You can also find links to various resources to assist in building apps with Flu
7474
- Additionally, ensure that you have added a name to your FlutterFlow profile. The same name will be used for the community forum profile.
7575
:::
7676

77-
- **URL Access (Only Available for Enterprise Users)**: You can view and copy URLs that need to be whitelisted for FlutterFlow to function correctly in enterprise environments with restricted internet access. Check out docs on **[Whitelisting URLS](../../misc/enterprise-page.md#whitelist-urls)**.
77+
- **URL Access (Only Available for Enterprise Users)**: You can view and copy URLs that need to be whitelisted for FlutterFlow to function correctly in enterprise environments with restricted internet access. Check out docs on **[Whitelisting URLs](../../misc/enterprise-page.md#whitelist-urls)**.
7878

7979
![url-access](imgs/url-access-dashboard.avif)
8080

docs/intro/ff-ui/storyboard.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,6 @@ Watch this video if you prefer watching a video tutorial.
5656
## FAQs
5757

5858
<details>
59-
<summary>I am getting "Error: Unable to initialize Storyboard</summary>
59+
<summary>I am getting "Error: Unable to initialize Storyboard"</summary>
6060
<p>This error typically occurs because the initial page has not been set. To resolve this, please set the initial page in the [App Details](../../resources/projects/settings/general-settings.md#app-details) settings of your project.</p>
6161
</details>

0 commit comments

Comments
 (0)