Flutter云函数调用插件cloud_functions的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter云函数调用插件cloud_functions的使用

Firebase Cloud Functions for Flutter

Flutter Favorite

pub package

这是一个用于在Flutter中使用Firebase Cloud Functions API的插件。要了解更多关于Cloud Functions的信息,请访问Firebase官网

Getting Started

开始使用Firebase Cloud Functions,请参考官方文档

Usage

要使用此插件,可以参考Functions Usage文档

Issues and feedback

如果您遇到与FlutterFire相关的问题、错误或有功能需求,请在我们的问题跟踪器上提交。对于不是特定于FlutterFire的插件问题,可以在Flutter问题跟踪器上提交。若想为插件贡献代码,请先阅读我们的贡献指南,然后打开一个pull request

示例代码

以下是一个完整的示例demo,展示了如何在Flutter应用中使用cloud_functions插件来调用云端函数:

// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:core';
import 'dart:io';

import 'package:cloud_functions/cloud_functions.dart';
import 'package:cloud_functions_example/firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  // 如果您需要使用本地运行的Functions Emulator,请取消下面这行的注释
  // https://firebase.google.com/docs/functions/local-emulator
  // FirebaseFunctions.instance.useFunctionsEmulator('localhost', 5001);

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List fruit = [];

  @override
  Widget build(BuildContext context) {
    final localhostMapped =
        kIsWeb || !Platform.isAndroid ? 'localhost' : '10.0.2.2';

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Firebase Functions Example'),
        ),
        body: Center(
          child: ListView.builder(
            itemCount: fruit.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('${fruit[index]}'),
              );
            },
          ),
        ),
        floatingActionButton: Builder(
          builder: (context) {
            return Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.end,
              children: [
                FloatingActionButton.extended(
                  onPressed: () async {
                    HttpsCallable callable =
                        FirebaseFunctions.instance.httpsCallable(
                      'listFruit',
                      options: HttpsCallableOptions(
                        timeout: const Duration(seconds: 5),
                      ),
                    );

                    await callingFunction(callable, context);
                  },
                  label: const Text('Call Function'),
                  icon: const Icon(Icons.cloud),
                  backgroundColor: Colors.deepOrange,
                ),
                const SizedBox(height: 10),
                FloatingActionButton.extended(
                  onPressed: () async {
                    HttpsCallable callable =
                        FirebaseFunctions.instance.httpsCallableFromUrl(
                      'http://$localhostMapped:5001/flutterfire-e2e-tests/us-central1/listfruits2ndgen',
                      options: HttpsCallableOptions(
                        timeout: const Duration(seconds: 5),
                      ),
                    );

                    await callingFunction(callable, context);
                  },
                  label: const Text('Call 2nd Gen Function'),
                  icon: const Icon(Icons.cloud),
                  backgroundColor: Colors.deepOrange,
                ),
              ],
            );
          },
        ),
      ),
    );
  }

  Future<void> callingFunction(
    HttpsCallable callable,
    BuildContext context,
  ) async {
    try {
      final result = await callable();
      setState(() {
        fruit.clear();
        result.data.forEach((f) {
          fruit.add(f);
        });
      });
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('ERROR: $e'),
        ),
      );
    }
  }
}

关键点解释

  • 初始化Firebase:在main()函数中使用await Firebase.initializeApp(...)来初始化Firebase。
  • 使用Functions Emulator(可选):如果需要使用本地运行的Firebase Functions模拟器,可以通过FirebaseFunctions.instance.useFunctionsEmulator('localhost', 5001);进行设置。
  • 调用云端函数:通过HttpsCallable对象调用云端函数,并通过callingFunction方法处理结果和异常。
  • UI更新:根据云端函数返回的结果更新UI显示的内容。

以上就是关于Flutter云函数调用插件cloud_functions的基本介绍和使用示例,希望对您有所帮助!


更多关于Flutter云函数调用插件cloud_functions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云函数调用插件cloud_functions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用cloud_functions插件来调用云函数的示例代码。这个示例假设你已经在Firebase中设置好了云函数,并且已经安装了cloud_functions插件。

1. 安装依赖

首先,确保在你的pubspec.yaml文件中添加了cloud_functions依赖:

dependencies:
  flutter:
    sdk: flutter
  cloud_functions: ^3.2.5  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Firebase

确保你的Flutter应用已经配置好了Firebase。你需要在Firebase控制台中为你的应用添加项目,并下载google-services.json文件(对于Android)和GoogleService-Info.plist文件(对于iOS),然后将它们放置在你的Flutter项目的android/app/ios/Runner/目录下。

3. 初始化Cloud Functions

在你的Flutter应用中,你需要初始化Cloud Functions。这通常在应用启动时完成。

import 'package:flutter/material.dart';
import 'package:cloud_functions/cloud_functions.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化Cloud Functions
  CloudFunctions.instance.useFunctionsEmulator('http://localhost:5001'); // 如果你在使用本地模拟器
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cloud Functions Example'),
        ),
        body: Center(
          child: CloudFunctionExample(),
        ),
      ),
    );
  }
}

4. 调用云函数

下面是一个调用云函数的示例。假设你有一个名为helloWorld的云函数,它不接受任何参数并返回一个字符串。

import 'package:flutter/material.dart';
import 'package:cloud_functions/cloud_functions.dart';

class CloudFunctionExample extends StatefulWidget {
  @override
  _CloudFunctionExampleState createState() => _CloudFunctionExampleState();
}

class _CloudFunctionExampleState extends State<CloudFunctionExample> {
  String? result;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () async {
            // 调用名为 'helloWorld' 的云函数
            HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(functionName: 'helloWorld');
            try {
              final HttpsCallableResult result = await callable.call();
              setState(() {
                this.result = result.data['message']; // 假设云函数返回的数据中有一个 'message' 键
              });
            } catch (e) {
              setState(() {
                this.result = 'Error: ${e.message}';
              });
            }
          },
          child: Text('Call Cloud Function'),
        ),
        if (result != null) Text('Result: $result'),
      ],
    );
  }
}

5. 云函数示例(Node.js)

为了完整性,这里提供一个简单的Node.js云函数示例,它符合上面的Flutter代码调用。

// index.js
const functions = require('firebase-functions');

exports.helloWorld = functions.https.onCall((data, context) => {
  return { message: 'Hello, World!' };
});

确保你已经部署了这个云函数到你的Firebase项目。

总结

这个示例展示了如何在Flutter应用中配置和使用cloud_functions插件来调用Firebase云函数。从安装依赖、初始化Cloud Functions,到调用云函数并处理结果,这些步骤应该能够帮助你在Flutter项目中成功集成云函数功能。

回到顶部