This skill defines how to correctly use Firebase Realtime Database in Flutter applications.
Use this skill when working with Firebase Realtime Database for simple data models, low-latency sync, or presence functionality. For rich data models requiring complex queries and high scalability, use Cloud Firestore instead.
Choose Realtime Database when your app needs:
Choose Cloud Firestore instead for rich data models requiring queryability, scalability, and high availability.
flutter pub add firebase_database
import 'package:firebase_database/firebase_database.dart';
// After Firebase.initializeApp():
final DatabaseReference ref = FirebaseDatabase.instance.ref();
FirebaseDatabase.instance.setPersistenceEnabled(true);
FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000); // 10MB
final newPostKey = FirebaseDatabase.instance.ref().child('posts').push().key;
. $ # [ ] / or ASCII control characters 0–31 or 127..indexOn in security rules to index frequently queried fields:{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
orderByChild(), orderByKey(), or orderByValue():final query = FirebaseDatabase.instance.ref("dinosaurs").orderByChild("height");
limitToFirst() or limitToLast():final query = ref.orderByChild("height").limitToFirst(10);
Read once:
final snapshot = await FirebaseDatabase.instance.ref('users/123').get();
if (snapshot.exists) {
print(snapshot.value);
}
Real-time listener:
FirebaseDatabase.instance.ref('users/123').onValue.listen((event) {
final data = event.snapshot.value;
print(data);
});
A DatabaseEvent fires every time data changes at the reference, including changes to children.
Write (replace):
await ref.set({
"name": "John",
"age": 18,
});
Update (partial):
await ref.update({"age": 19});
Atomic transaction:
FirebaseDatabase.instance.ref('posts/123/likes').runTransaction((currentValue) {
return (currentValue as int? ?? 0) + 1;
});
Multi-path atomic update:
final updates = <String, dynamic>{
'posts/$postId': postData,
'user-posts/$uid/$postId': postData,
};
FirebaseDatabase.instance.ref().update(updates);
FirebaseDatabase.instance.ref('posts/123/timestamp').set(ServerValue.timestamp);
FirebaseDatabase.instance.setPersistenceEnabled(true);
// Keep critical paths synced when offline
FirebaseDatabase.instance.ref('important-data').keepSynced(true);
// Detect connection state
FirebaseDatabase.instance.ref('.info/connected').onValue.listen((event) {
final connected = event.snapshot.value as bool? ?? false;
print('Connected: $connected');
});
onValue) to read data and get notified of updates — optimized for online/offline transitions.get() only when you need data once; it probes local cache if the server is unavailable.{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
.read, .write, .validate, and .indexOn to control access and validate data.auth variable to authenticate users in security rules.