Adaptador de base de datos en tiempo real de Firebase
El paquete tracelet_firebase proporciona un adaptador directo e integrado para sincronizar sus ubicaciones en segundo plano directamente con Firebase Realtime Database (RTDB): 100 % sin servidor, sin funciones de nube que implementar.
Instalación
Añade el adaptador a tu pubspec.yaml:
flutter pub add tracelet_firebaseEste adaptador utiliza firebase_core y firebase_auth. Debes configurar tu aplicación Flutter para Firebase (usando flutterfire configure) y crear una base de datos en tiempo real en la consola de Firebase antes de usarla.
Cómo funciona
A diferencia de la integración del SDK de Firestore, este adaptador no abre una ruta de escritura separada. Se conecta al motor de sincronización HTTP nativo de bajo consumo de batería de Tracelet: buildHttpConfig produce un HttpConfig que apunta al extremo REST de su RTDB (<database>/<path>.json), autenticado con el token de ID de autenticación de Firebase como parámetro de consulta ?auth=.
Debido a que la sincronización se ejecuta en el motor nativo, los lotes se cargan con un retraso exponencial y colas fuera de línea incluso cuando se fuerza el cierre de la aplicación. Cuando un token caduca y RTDB devuelve 401, configureTokenRefresh actualiza de forma transparente el token de ID de Firebase (en primer plano y en un fondo aislado sin cabeza) y vuelve a intentarlo.
Instalación y configuración
Inicializar base de fuego
Inicialice Firebase en su main.dart antes de llamar a Tracelet:
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());
}Configure la actualización del token y cree la configuración HTTP
Llame a configureTokenRefresh() una vez, luego cree HttpConfig para su ruta RTDB y páselo a 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();El usuario debe estar autenticado para que la escritura se realice correctamente según las reglas seguras. Si aún no tiene un flujo de inicio de sesión real, FirebaseAuth.instance.signInAnonymously() es suficiente para obtener uid durante la prueba.
Adjuntar metadatos personalizados
Para etiquetar cada ubicación con datos comerciales (por ejemplo, order_id o trip_id), use setRouteContext(): viaja con cada ubicación a través de la cola SQLite y se incluye en la carga útil RTDB:
await Tracelet.setRouteContext(RouteContext(
taskId: 'order_123',
custom: {'trip_id': 'trip_456'},
));Reglas de seguridad
Asegure su base de datos en tiempo real para que los usuarios autenticados solo puedan escribir en su propia ruta de ubicación:
{
"rules": {
"locations": {
"$uid": {
".read": "auth != null && auth.uid === $uid",
".write": "auth != null && auth.uid === $uid"
}
}
}
}