Skip to main content

Using Cloud Functions for Firebase

Notice

This page is archived and might not reflect the latest version of the FlutterFire plugins. You can find the latest information on firebase.google.com:

To start using the Cloud Functions for Firebase package within your project, import it at the top of your project files:

import 'package:cloud_functions/cloud_functions.dart';

Before using Cloud Functions, you must first have ensured you have initialized FlutterFire.

To create a new Cloud Functions for Firebase instance, call the instance getter on FirebaseFunctions:

FirebaseFunctions functions = FirebaseFunctions.instance;

By default, this allows you to interact with Cloud Functions using the default Firebase App used whilst installing Cloud Functions on your platform. If however you'd like to use Cloud Functions with a secondary Firebase App, use the instanceFor method:

FirebaseApp secondary = Firebase.app('Secondary');
FirebaseFunctions secondaryApp = FirebaseFunctions.instanceFor(app: secondary);

Calling Endpoints#

Assuming we have a deployed function named listFruit, we can call the Cloud Function using the httpsCallable method. For example:

Deployed Function
const functions = require('firebase-functions');
exports.listFruit = functions.https.onCall((data, context) => {
return ["Apple", "Banana", "Cherry", "Date", "Fig", "Grapes"]
});

Within Flutter, the function can be called, and the results accessed:

import 'package:cloud_functions/cloud_functions.dart';
Future<void> getFruit() async {
HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('listFruit');
final results = await callable();
List fruit = results.data; // ["Apple", "Banana", "Cherry", "Date", "Fig", "Grapes"]
}

Calling Endpoints with Parameters#

Let's have a look at calling Cloud Functions with additional parameters:

Deployed Function
exports.writeMessage = functions.https.onCall(async (data, context) => {
// Grab the text parameter.
const original = data.text;
//Returns the text received
return `Successfully received: ${original}`;
});

Within Flutter, the function can be called, and the results accessed:

import 'package:cloud_functions/cloud_functions.dart';
Future<void> writeMessage(String message) async {
HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('writeMessage');
final resp = await callable.call(<String, dynamic>{
'text': 'A message sent from a client device',
});
print("result: ${resp.data}");
}

Specifying regions#

If you wish to specify a region for a Cloud Function that runs in any region other than us-central1, you can do this by passing the region to the FirebaseFunctions instance, using instanceFor:

HttpsCallableResult callable = await FirebaseFunctions
.instanceFor(region: 'europe-west1')
.httpsCallable('getName');

Emulator Usage#

If you are using the local Cloud Functions emulators, then it is possible to connect to these using the useFunctionsEmulator method. Ensure you pass the correct port on which the Firebase emulator is running on. Ensure you have enabled network connections to the emulators in your apps following the emulator usage instructions in the general FlutterFire installation notes for each operating system. You only have to call useFunctionsEmulator once, so do it as early as possible.

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
// Ideal time to initialize
FirebaseFunctions.instance.useFunctionsEmulator('localhost', 5001);
//...
}

If you have specified a region for your Cloud Function emulator, you will also have to provide the same region in your setup:

FirebaseFunctions.instanceFor(region: 'europe-west1')
.useFunctionsEmulator('localhost', 5001);

iOS#

When using the Firebase emulator while debugging an iOS application, you may receive an error regarding App Transport Security. To fix it, please use the following steps:

  1. Open ios/Runner.xcworkspace in Xcode.
  2. Open Runner/info.plist.
  3. Add a property called App Transport Security Settings.
  4. Right click on that property and click Add Row.
  5. Add a property called Allows Local Networking and enter its value as YES.

Android#

If you are targeting apps using Android 8.0+, the platform will block the http endpoint. The simplest solution is to change this in your debug builds by adding the following to your android/app/src/main/AndroidManifest.xml file:

<application
android:usesCleartextTraffic="true"
/>

If you are concerned about security, you can set a more advanced per-host network security file