Skip to Content

Firebase 实时数据库适配器

tracelet_firebase 包提供了一个无缝的嵌入式适配器,可将您的后台位置直接同步到 Firebase 实时数据库 (RTDB) — 100% 无服务器,无需部署云功能。

安装

将适配器添加到您的 pubspec.yaml

flutter pub add tracelet_firebase

该适配器使用 firebase_corefirebase_auth。在使用之前,您必须为 Firebase 配置 Flutter 应用(使用 flutterfire configure)并在 Firebase 控制台中创建实时数据库

它是如何运作的

与 Firestore SDK 集成不同,此适配器打开单独的写入路径。它插入 Tracelet 的电池高效 本机 HTTP 同步引擎buildHttpConfig 生成指向 RTDB 的 REST 端点 (<database>/<path>.json) 的 HttpConfig,并使用 Firebase 身份验证 ID 令牌作为 ?auth= 查询参数进行身份验证。

由于同步在本机引擎中运行,因此即使应用程序强制退出**,也会以指数退避和离线排队方式上传批次。当令牌过期且 RTDB 返回 401 时,configureTokenRefresh 会透明地刷新 Firebase ID 令牌(在前台无头后台隔离中)并重试。

设置和配置

初始化 Firebase

在调用 Tracelet 之前在 main.dart 中初始化 Firebase:

import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(const MyApp()); }

配置令牌刷新并构建 HTTP 配置

调用 configureTokenRefresh() 一次,然后为 RTDB 路径构建 HttpConfig 并将其传递给 Tracelet.ready

import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:tracelet_firebase/tracelet_firebase.dart'; import 'package:tracelet/tracelet.dart'; // 1. Your Realtime Database URL (from FirebaseOptions). final databaseUrl = Firebase.app().options.databaseURL; // 2. Keep the Firebase ID token fresh in the background (resolves 401s). await TraceletFirebase.configureTokenRefresh(); // 3. Get the signed-in user's id for a per-user write path. final uid = FirebaseAuth.instance.currentUser?.uid ?? 'anonymous_device'; // 4. Build the native HTTP config for RTDB. final httpConfig = await TraceletFirebase.buildHttpConfig( databaseUrl: databaseUrl!, // e.g. https://my-project-default-rtdb.firebaseio.com path: 'locations/$uid', // secure this path in your RTDB rules // autoSync: true, batchSync: true, maxBatchSize: 250 are the defaults ); // 5. Start Tracelet with the adapter's HTTP config. await Tracelet.ready(Config( geo: const GeoConfig(distanceFilter: 50), http: httpConfig, )); await Tracelet.start();

必须对用户进行身份验证,写入才能根据安全规则成功。如果您还没有真正的登录流程,FirebaseAuth.instance.signInAnonymously() 足以在测试时获得 uid

附加自定义元数据

要使用业务数据标记每个位置(例如 order_idtrip_id),请使用 setRouteContext() — 它通过 SQLite 队列与每个位置一起传输,并包含在 RTDB 有效负载中:

await Tracelet.setRouteContext(RouteContext( taskId: 'order_123', custom: {'trip_id': 'trip_456'}, ));

安全规则

保护您的实时数据库,以便经过身份验证的用户只能写入自己的位置路径:

{ "rules": { "locations": { "$uid": { ".read": "auth != null && auth.uid === $uid", ".write": "auth != null && auth.uid === $uid" } } } }