Flutter Firebase云函数集成插件dart_firebase_functions_builder的使用

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

Flutter Firebase云函数集成插件dart_firebase_functions_builder的使用

动机

本项目旨在为Dart提供类似Node.js firebase-functions包的功能,使用了functions_frameworkdart_firebase_admin包。

如何使用

安装

请在你的Flutter应用的pubspec.yaml文件中添加以下依赖:

dependencies:
  dart_firebase_admin: latest
  dart_firebase_functions: latest
  functions_framework: latest
  shelf:

dev_dependencies:
  build_runner:
  dart_firebase_functions_builder: latest
定义adminApp

在定义函数之前,需要配置FirebaseAdminApp并使用你的凭证。

import 'package:dart_firebase_admin/dart_firebase_admin.dart';
import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'package:functions_framework/functions_framework.dart';

final adminApp = FirebaseAdminApp.initializeApp(
  'your-project-id',
  Credential.fromServiceAccountParams(
    clientId: 'your-client-id',
    privateKey: 'your-private-key',
    email: 'your-client-email',
  ),
);

final firestore = Firestore(adminApp);

final auth = Auth(adminApp);

final messaging = Messaging(adminApp);
定义HTTP函数

使用@HTTPFunction()来定义HTTP函数。

import 'package:dart_firebase_admin/dart_firebase_admin.dart';
import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'package:shelf/shelf.dart';

FirebaseAdminApp initializeAdminApp() => adminApp;

@HTTPFunction()
Future<Response> hello(Request request) async => Response.ok('Hello, World!');

然后运行builder_runner生成代码:

dart pub run build_runner build -d

你将得到类似如下的代码:

// GENERATED CODE - DO NOT MODIFY BY HAND

import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'package:functions_framework/serve.dart';
import 'package:server/functions.dart' as function_library;

Future<void> main(List<String> args) async {
  final app = function_library.initializeAdminApp();
  FirebaseFunctions.initialize(app);
  await serve(args, _nameToFunctionTarget);
}

FunctionTarget? _nameToFunctionTarget(String name) => switch (name) {
      'hello' => FunctionTarget.http(
          function_library.hello,
        ),
      _ => null
    };
定义Cloud Firestore触发的函数

为了定义一个由Cloud Firestore文档创建触发的函数,使用@OnDocumentCreated并传递相应的参数。

import 'package:dart_firebase_admin/dart_firebase_admin.dart';
import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'package:functions_framework/functions_framework.dart';

FirebaseAdminApp initializeAdminApp() => adminApp;

@OnDocumentCreated('todos/{todoId}')
Future<void> oncreatetodo(
  ({String todoId}) params,
  QueryDocumentSnapshot snapshot,
  RequestContext context,
) async {
  context.logger.debug('todoId: ${params.todoId}');
  final data = snapshot.data();
  final title = data?['title'] as String?;
  await snapshot.ref.update({'title': '$title from server!'});
}

也可以通过嵌套文档创建触发。

@OnDocumentCreated('todos/{todoId}/logs/{logId}')
Future<void> oncreatelog(
  ({String todoId, String logId}) params,
  QueryDocumentSnapshot snapshot,
  RequestContext context,
) async {
  final todoId = params.todoId;
  final logId = params.logId;
  final data = snapshot.data();
  context.logger.debug('todoId: $todoId');
  context.logger.debug('logId: $logId');
  context.logger.debug('data: $data');
}

然后运行builder_runner生成代码:

dart pub run build_runner build -d

你将得到类似如下的代码:

// GENERATED CODE - DO NOT MODIFY BY HAND

import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'package:functions_framework/serve.dart';
import 'package:server/functions.dart' as function_library;

Future<void> main(List<String> args) async {
  final app = function_library.initializeAdminApp();
  FirebaseFunctions.initialize(app);
  await serve(args, _nameToFunctionTarget);
}

FunctionTarget? _nameToFunctionTarget(String name) => switch (name) {
      'oncreatetodo' => FunctionTarget.cloudEventWithContext((event, context) {
          const pathPattern = 'todos/{todoId}';
          final documentIds =
              FirestorePathParser(pathPattern).parse(event.subject!);
          final data = QueryDocumentSnapshotBuilder(event).fromCloudEvent();
          return function_library.oncreatetodo(
            (todoId: documentIds['todoId']!),
            data.snapshot,
            context,
          );
        }),
      'oncreatelog' => FunctionTarget.cloudEventWithContext((event, context) {
          const pathPattern = 'todos/{todoId}/logs/{logId}';
          final documentIds =
              FirestorePathParser(pathPattern).parse(event.subject!);
          final data = QueryDocumentSnapshotBuilder(event).fromCloudEvent();
          return function_library.oncreatelog(
            (todoId: documentIds['todoId']!, logId: documentIds['logId']!),
            data.snapshot,
            context,
          );
        }),
      _ => null
    };

示例代码

void main() {
  print('Hello, World!');
}

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

1 回复

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


在Flutter项目中集成Firebase云函数并使用dart_firebase_functions_builder插件,你可以按照以下步骤进行。这个插件允许你调用部署在Firebase上的云函数,并且能自动生成类型安全的Dart代码来调用这些函数。以下是一个详细的代码案例,帮助你完成集成。

1. 准备工作

确保你已经完成了以下准备工作:

  • 安装了Flutter和Dart开发环境。
  • 在Firebase项目中启用了Cloud Functions。
  • 已经部署了一个或多个Cloud Functions。
  • 在Firebase项目中添加了Flutter应用,并配置了必要的认证(如Google Sign-In或Email/Password)。

2. 添加依赖

首先,在你的pubspec.yaml文件中添加dart_firebase_functions_builder依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_firebase_functions: ^x.y.z  # 使用最新版本
  dart_firebase_functions_builder: ^x.y.z  # 使用最新版本

dev_dependencies:
  build_runner: ^x.y.z  # 使用最新版本

替换^x.y.z为实际的最新版本号。

3. 配置Firebase

在你的Flutter项目根目录下,确保有一个firebase-adminsdk.json文件(这个文件是从Firebase项目设置中下载的),用于配置Firebase Admin SDK。这个文件通常用于云函数的后端配置,但在某些情况下,它也可以用于Flutter客户端进行身份验证。不过,对于云函数调用,通常不需要这个文件,因为身份验证是通过Firebase Authentication完成的。

4. 使用dart_firebase_functions_builder生成代码

创建一个functions文件夹,并在其中创建一个functions.yaml文件,定义你要调用的云函数。例如:

# functions/functions.yaml
functions:
  helloWorld:
    region: us-central1  # 云函数部署的区域
    httpsTrigger:
      url: "https://us-central1-<your-project-id>.cloudfunctions.net/helloWorld"

替换<your-project-id>为你的Firebase项目ID。

然后,运行以下命令生成Dart代码:

flutter pub get
flutter pub run build_runner build --build-target=dart_firebase_functions_builder:build

这将在你的项目中生成一个lib/generated/functions.dart文件,包含类型安全的云函数调用代码。

5. 调用云函数

在你的Flutter应用中,你可以像这样调用生成的云函数:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:dart_firebase_functions/dart_firebase_functions.dart';
import 'generated/functions.dart' as functions;  // 导入生成的代码

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Firebase Functions Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                // 确保用户已登录
                final User? user = FirebaseAuth.instance.currentUser;
                if (user == null) {
                  // 处理未登录情况
                  return;
                }

                // 调用云函数
                final result = await functions.helloWorld();
                print('Cloud Function Result: ${result.data}');
              } catch (e) {
                print('Error calling cloud function: $e');
              }
            },
            child: Text('Call Hello World Function'),
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击按钮时会调用名为helloWorld的云函数,并打印结果。

注意事项

  • 确保你的Firebase云函数已经正确部署并可以正常工作。
  • 确保你的Flutter应用已经配置了Firebase Authentication,并且用户已经登录。
  • 根据你的云函数需求,可能需要在functions.yaml文件中定义更多的函数和参数。

这样,你就完成了Flutter与Firebase云函数的集成,并使用dart_firebase_functions_builder插件生成并调用了云函数。

回到顶部