Flutter Firebase云函数集成插件dart_firebase_functions_builder的使用
Flutter Firebase云函数集成插件dart_firebase_functions_builder的使用
动机
本项目旨在为Dart提供类似Node.js firebase-functions
包的功能,使用了functions_framework
和dart_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
更多关于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
插件生成并调用了云函数。