Flutter āđāļĨāļ° Firebase āđāļāļāļĩ 2026: āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļ, Firestore āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ
āđāļāļēāļ°āļĨāļķāļ Flutter Firebase: āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāđāļ§āļĒ firebase_auth, CRUD āļāļāļ Firestore āđāļĨāļ°āļŠāļāļĢāļĩāļĄāđāļāļāđāļĢāļĩāļĒāļĨāđāļāļĄāđ, āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļāļāđāļāļĒāļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

āļāļēāļĢāļāļŠāļēāļāļĢāļ§āļĄ Flutter āļāļąāļ Firebase āļĒāļąāļāļāļāđāļāđāļāļāļąāļ§āđāļĨāļ·āļāļāđāļāđāļāđāļāļāļāđāļāļĩāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāļĄāļēāļāļāļĩāđāļŠāļļāļāļŠāļģāļŦāļĢāļąāļāđāļāļāļāļĨāļīāđāļāļāļąāļ Flutter āđāļāļāļĩ 2026 āđāļāļĒāļāļąāļāđāļāļĨāļ·āđāļāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļ āļāļēāļāļāđāļāļĄāļđāļĨāđāļāļāđāļĢāļĩāļĒāļĨāđāļāļĄāđ āđāļĨāļ° cloud functions āđāļāđāļāļāļāļąāļāļĨāđāļēāļ āļāđāļ§āļĒ FlutterFire SDK v4.15 āđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāđāļēāļ āđ āđāļāđāļāļąāļāļāļēāļāļķāđāļāļāļĒāđāļēāļāļĄāļēāļ āļāļąāđāļāđāļāđāļāļēāļĢāļāļąāđāļāļāđāļēāļāļĩāđāļāļĢāļ°āļāļąāļāļāđāļēāļ flutterfire configure āđāļāļāļāļāļķāļāļāļēāļĢāļĢāļāļāļĢāļąāļāļĢāļ°āļāļąāļāļāļąāđāļāļāļģāļŠāļģāļŦāļĢāļąāļ Firestore Pipelines āđāļĨāļ° Firebase Admin Dart SDK
FlutterFire āļĢāļļāđāļāļĨāđāļēāļŠāļļāļāļĄāļēāļāļĢāđāļāļĄāļāļąāļ firebase_auth v6.1.2 āđāļĨāļ° cloud_firestore v6.4.1 āļĢāļāļāļĢāļąāļ Firestore Pipelines āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļāļ TOTP āļāļ macOS āđāļĨāļ° API validatePassword āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļąāļāđāļāđāļāđāļĒāļāļēāļĒāļĢāļŦāļąāļŠāļāđāļēāļ
āļāļēāļĢāļāļąāđāļāļāđāļē Firebase āđāļāđāļāļĢāđāļāļāļāđ Flutter
āļāđāļāļāđāļāļĩāļĒāļāđāļāđāļ Firebase āđāļ āđ āđāļāļĢāđāļāļāļāđāļāļģāđāļāđāļāļāđāļāļāđāļāđāļĢāļąāļāļāļēāļĢāļāļģāļŦāļāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļĒāđāļēāļāļāļđāļāļāđāļāļ FlutterFire CLI āļāļ°āļāļģāļāļēāļĢāļĨāļāļāļ°āđāļāļĩāļĒāļāđāļāļĨāļāļāļāļĢāđāļĄāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļīāđāļĨāļ°āļŠāļĢāđāļēāļāđāļāļĨāđāļāļēāļĢāļāļģāļŦāļāļāļāđāļēāļŠāļģāļŦāļĢāļąāļ Android, iOS, āđāļ§āđāļ āđāļĨāļ° macOS
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Firebase with platform-specific config
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const MyApp());
}āđāļāļĨāđ firebase_options.dart āļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļīāđāļĄāļ·āđāļāļĢāļąāļ flutterfire configure āđāļāļĨāđāļāļĩāđāļĄāļĩāļāļĩāļĒāđ API, āļĢāļŦāļąāļŠāđāļāļĢāđāļāļāļāđ āđāļĨāļ°āļāļąāļ§āļĢāļ°āļāļļāđāļāļāļēāļ°āđāļāļĨāļāļāļāļĢāđāļĄ āđāļāļĒāđāļĄāđāļāđāļāļāļāļąāļāļĨāļāļāļāđāļ§āļĒāļāļāđāļāļāļāļēāļ Firebase console
Firebase Authentication: āļāļĩāđāļĄāļĨ, Google āđāļĨāļ°āļŦāļĨāļēāļĒāļāļąāļāļāļąāļĒ
Firebase Authentication āļāļąāļāļāļēāļĢāļāļąāļ§āļāļāļāļāļāļāļđāđāđāļāđāļāđāļ§āļĒāđāļāđāļāļŠāļģāđāļĢāđāļāļĢāļđāļāļāļĩāđāļāđāļāļĒāļāļĩāđāļŠāļļāļ āđāļāđāļāđāļāļ firebase_auth āļĢāļāļāļĢāļąāļāļāļĩāđāļĄāļĨ/āļĢāļŦāļąāļŠāļāđāļēāļ, āļāļđāđāđāļŦāđāļāļĢāļīāļāļēāļĢ OAuth (Google, Apple, GitHub), āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāđāļēāļ SMS āļāļēāļāđāļāļĢāļĻāļąāļāļāđ āđāļĨāļ°āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļāļāļŦāļĨāļēāļĒāļāļąāļāļāļąāļĒ
āļāļēāļĢāļĨāļāļāļ°āđāļāļĩāļĒāļāļāđāļ§āļĒāļāļĩāđāļĄāļĨāđāļĨāļ°āļĢāļŦāļąāļŠāļāđāļēāļ
āļāļąāđāļāļāļāļāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļĢāļīāđāļĄāļāđāļāļāđāļ§āļĒāļāļĩāđāļĄāļĨ/āļĢāļŦāļąāļŠāļāđāļēāļ āđāļĄāļāļāļ createUserWithEmailAndPassword āļāļ°āļāļ·āļāļāđāļē UserCredential āļāļĩāđāļĄāļĩāļāđāļāļāđāļāļāļāđ User āļāļĩāđāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļĨāđāļ§
import 'package:firebase_auth/firebase_auth.dart';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
// Register with email and password
Future<User?> register(String email, String password) async {
try {
final credential = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
} on FirebaseAuthException catch (e) {
// Handle specific error codes
switch (e.code) {
case 'email-already-in-use':
throw Exception('This email is already registered');
case 'weak-password':
throw Exception('Password must be at least 6 characters');
default:
throw Exception('Registration failed: ${e.message}');
}
}
}
// Sign in with existing credentials
Future<User?> signIn(String email, String password) async {
final credential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
}
// Reactive auth state stream
Stream<User?> get authStateChanges => _auth.authStateChanges();
}āļŠāļāļĢāļĩāļĄ authStateChanges() āđāļāđāļāļ§āļīāļāļĩāļāļĩāđāđāļāļ°āļāļģāđāļāļāļēāļĢāļāļīāļāļāļēāļĄāļŠāļāļēāļāļ°āļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļąāđāļ§āļāļąāđāļāđāļāļ āđāļāļĒāļāļ°āļŠāđāļāļāđāļē User āļāļąāļāļāļļāļāļąāļāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļŠāļĄāļąāļāļĢāļĢāļąāļāļāđāļāļĄāļđāļĨ āđāļĨāļ°āļāļģāļāļēāļāļāļĩāļāļāļĢāļąāđāļāđāļāļāļļāļāđāļŦāļāļļāļāļēāļĢāļāđāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļŦāļĢāļ·āļāļāļāļāļāļēāļāļĢāļ°āļāļ
āļāļēāļĢāļāļŠāļēāļāļĢāļ§āļĄ Google Sign-In
āļāļđāđāđāļŦāđāļāļĢāļīāļāļēāļĢ OAuth āļāđāļāļāđāļāđāđāļāđāļāđāļāļāđāļāļīāđāļĄāđāļāļīāļĄ Google Sign-In āļāļ°āđāļĢāļĩāļĒāļāļāļąāļ§āđāļĨāļ·āļāļāļāļąāļāļāļĩāđāļāļāđāļāļāļĩāļ āļāļēāļāļāļąāđāļāđāļĨāļāđāļāļĨāļĩāđāļĒāļāđāļāđāļāđāļāļāļąāļ Firebase
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
Future<UserCredential> signInWithGoogle() async {
// Trigger the native Google Sign-In flow
final googleUser = await GoogleSignIn().signIn();
if (googleUser == null) throw Exception('Sign-in cancelled');
// Obtain auth details from the Google account
final googleAuth = await googleUser.authentication;
// Create a Firebase credential from the Google tokens
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
// Sign in to Firebase with the Google credential
return FirebaseAuth.instance.signInWithCredential(credential);
}āļĢāļđāļāđāļāļāļāļĩāđāđāļāđāđāļāđāļāļąāļāļāļđāđāđāļŦāđāļāļĢāļīāļāļēāļĢ OAuth āļāļąāđāļāļŦāļĄāļ: āļĢāļąāļāđāļāđāļāđāļāļāļāļāļāļđāđāđāļŦāđāļāļĢāļīāļāļēāļĢ āļŦāđāļāļŦāļļāđāļĄāđāļ§āđāđāļ credential āļāļāļ Firebase āđāļĨāđāļ§āđāļĢāļĩāļĒāļ signInWithCredential
Firebase Auth v6.1+ āļĄāļĩ API validatePassword āļāļķāđāļāļāđāļ§āļĒāđāļŦāđāļāļąāļāļāļąāļāđāļāđāļāđāļĒāļāļēāļĒāļĢāļŦāļąāļŠāļāđāļēāļāļāļąāđāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāđāļāđ āļāđāļĒāļāļēāļĒāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļāļ§āļēāļĄāļĒāļēāļ§āļāļąāđāļāļāđāļģ āļāļąāļ§āļāļīāļĄāļāđāđāļŦāļāđ āļāļąāļ§āļāļīāļĄāļāđāđāļĨāđāļ āļāļąāļ§āđāļĨāļ āđāļĨāļ°āļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐ āļāļķāđāļāļāļąāđāļāļŦāļĄāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļāđāļēāđāļāđāļāļēāļ Firebase console
āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢ CRUD āļāļāļ Firestore āđāļĨāļ°āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļāļģāļĨāļāļāļāđāļāļĄāļđāļĨ
Cloud Firestore āļāļąāļāļĢāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāđāļāđāļ collection āđāļĨāļ° document āļāđāļēāļāļāļēāļāļāļēāļāļāđāļāļĄāļđāļĨ SQL āļāļĢāļāļāļĩāđ Firestore āđāļĄāđāļĄāļĩ schema āđāļāļāļŠāļēāļĢāđāļāđāļĨāļ°āļāļāļąāļāļŠāļēāļĄāļēāļĢāļāļĄāļĩāļāļīāļĨāļāđāļāļĩāđāđāļāļāļāđāļēāļāļāļąāļāđāļāđ āļāļ§āļēāļĄāļĒāļ·āļāļŦāļĒāļļāđāļāļāļĩāđāđāļŦāļĄāļēāļ°āļāļąāļāđāļāļ Flutter āđāļāđāļāđāļāļāļāļēāļĢāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļāļģāļĨāļāļāļāđāļāļĄāļđāļĨāļāļĒāđāļēāļāļĄāļĩāļ§āļīāļāļąāļĒāđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļąāļāļŦāļēāļāđāļēāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ
āļāļēāļĢāđāļāļĩāļĒāļāđāļĨāļ°āļāļēāļĢāļāđāļēāļ Document
āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļāļ Firestore āļāļģāđāļāđāļāļĒāđāļēāļāļāļĢāļāđāļāļāļĢāļāļĄāļēāļāđāļ§āļĒāđāļāđāļāđāļāļ cloud_firestore āļāļļāļāļāļēāļĢāļāđāļēāļāđāļĨāļ°āļāļēāļĢāđāļāļĩāļĒāļāļāļ°āļĄāļļāđāļāđāļāđāļēāđāļāļāļĩāđāđāļŠāđāļāļāļēāļāļāļāļ document āļāļĩāđāđāļāļāļēāļ°āđāļāļēāļ°āļāļ
import 'package:cloud_firestore/cloud_firestore.dart';
class TaskService {
final _db = FirebaseFirestore.instance;
final String _collection = 'tasks';
// Create a new document with auto-generated ID
Future<String> createTask(String userId, String title) async {
final doc = await _db.collection(_collection).add({
'userId': userId,
'title': title,
'completed': false,
'createdAt': FieldValue.serverTimestamp(),
});
return doc.id;
}
// Read a single document by ID
Future<Map<String, dynamic>?> getTask(String taskId) async {
final snapshot = await _db.collection(_collection).doc(taskId).get();
return snapshot.data();
}
// Update specific fields without overwriting the entire document
Future<void> toggleComplete(String taskId, bool completed) async {
await _db.collection(_collection).doc(taskId).update({
'completed': completed,
'updatedAt': FieldValue.serverTimestamp(),
});
}
// Delete a document
Future<void> deleteTask(String taskId) async {
await _db.collection(_collection).doc(taskId).delete();
}
}FieldValue.serverTimestamp() āļĢāļąāļāļāļĢāļ°āļāļąāļ timestamp āļāļĩāđāļŠāļāļāļāļĨāđāļāļāļāļąāļāđāļāļāļļāļāļāļļāļāļāļĢāļāđ āđāļāļĒāđāļāđāļāļēāļŽāļīāļāļēāļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ Firestore āđāļāļāļāļēāļŽāļīāļāļēāļāļāļāđāļāļĨāđāļāļāļāđ
āļŠāļāļĢāļĩāļĄāđāļāļāđāļĢāļĩāļĒāļĨāđāļāļĄāđāļāđāļ§āļĒ snapshots()
Firestore āđāļāļāđāļāđāļāļāđāļ§āļĒāļāļēāļĢāļāļīāļāđāļāļĢāđāļāļāđāđāļāļāđāļĢāļĩāļĒāļĨāđāļāļĄāđ āđāļĄāļāļāļ snapshots() āļāļ·āļāļāđāļē Stream āļāļĩāđāļŠāđāļāļāđāļāļĄāļđāļĨāđāļŦāļĄāđāļāļļāļāļāļĢāļąāđāļāļāļĩāđ document āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāļĄāļĩāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ āđāļāļĒāđāļĄāđāļāđāļāļ polling
import 'package:cloud_firestore/cloud_firestore.dart';
class TaskStream {
final _db = FirebaseFirestore.instance;
// Stream all tasks for a specific user, ordered by creation date
Stream<List<Map<String, dynamic>>> userTasks(String userId) {
return _db
.collection('tasks')
.where('userId', isEqualTo: userId)
.orderBy('createdAt', descending: true)
.snapshots()
.map((snapshot) => snapshot.docs.map((doc) {
final data = doc.data();
data['id'] = doc.id; // Include document ID
return data;
}).toList());
}
}āļ āļēāļĒāđāļ widget āļāļāļ Flutter āļŠāļāļĢāļĩāļĄāļāļĩāđāļāļŠāļēāļāļĢāļ§āļĄāđāļāļĒāļāļĢāļāļāļąāļ StreamBuilder āđāļāļ·āđāļāļŠāļĢāđāļēāļ UI āđāļŦāļĄāđāđāļāļāļļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļāļāļāļēāļāļāđāļāļĄāļđāļĨ Firestore āļāļąāļāļāļēāļĢāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ āļāļēāļĢāđāļāļ āđāļĨāļ°āļāļēāļĢāļāļāļāļĒāļđāđāđāļāļāļāļāļāđāļĨāļāđāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Flutter āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļāļ Firestore āļŠāļģāļŦāļĢāļąāļāđāļāļ Flutter
āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļģāļāļēāļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ Firestore āđāļĨāļ°āļāļ§āļāļāļļāļĄāļŠāļīāļāļāļīāđāļāļēāļĢāļāđāļēāļ/āđāļāļĩāļĒāļāđāļāļĢāļ°āļāļąāļ document āļŦāļēāļāđāļĄāđāļĄāļĩāļāļāļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄ āļāļđāđāđāļāđāļāļĩāđāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļĨāđāļ§āļāļļāļāļāļāļŠāļēāļĄāļēāļĢāļāļāđāļēāļāļŦāļĢāļ·āļāđāļāđāđāļ document āđāļāļāđāđāļāđ
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Users can only access their own profile
match /users/{userId} {
allow read, update: if request.auth != null
&& request.auth.uid == userId;
allow create: if request.auth != null;
allow delete: if false; // Prevent self-deletion
}
// Tasks belong to the user who created them
match /tasks/{taskId} {
allow read, write: if request.auth != null
&& resource.data.userId == request.auth.uid;
allow create: if request.auth != null
&& request.resource.data.userId == request.auth.uid;
}
}
}āļāļąāļ§āđāļāļĢ request.auth.uid āļĄāļĩ ID āļāļāļāļāļđāđāđāļāđāļāļĩāđāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļĨāđāļ§āļāļēāļ Firebase Auth āļāļāļāļĩāđāļāđāļēāļāļāļīāļ resource.data āļāļ°āļāļĢāļ§āļāļŠāļāļāļāļīāļĨāļāđāļāļāļ document āļāļĩāđāļĄāļĩāļāļĒāļđāđ āđāļāļāļāļ°āļāļĩāđ request.resource.data āļāļ°āļāļĢāļ§āļāļŠāļāļāļāđāļāļĄāļđāļĨāļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļāļģāļĨāļąāļāđāļāđāļēāļĄāļē
Firestore āļāļ°āļāļāļīāđāļŠāļāļāļēāļĢāđāļāđāļēāļāļķāļāļāļąāđāļāļŦāļĄāļāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāđāļāđāļŦāļĄāļ production āļāļļāļ collection āļāđāļāļāļĄāļĩāļāļāļāļĩāđāļāļąāļāđāļāļ āļāđāļāļāļīāļāļāļĨāļēāļāļāļĩāđāļāļāļāđāļāļĒāđāļāđāļāļĢāđāļāļāļāđ Flutter: āļāļēāļĢāļāļąāļāļāļēāļāđāļ§āļĒāļāļāđāļŦāļĄāļāļāļāļŠāļāļ (allow read, write: if true) āđāļĨāđāļ§āļĨāļ·āļĄāļĨāđāļāļāļāđāļāļāļāļģāļāļķāđāļ production
āļāļēāļĢāļāļāļāļĒāļđāđāđāļāļāļāļāļāđāļĨāļāđāđāļĨāļ°āļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļāļ
Firestore āđāļāļīāļāđāļāđāļāļēāļāļāļēāļĢāļāļāļāļĒāļđāđāđāļāļāļāļāļāđāļĨāļāđāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļāđāļāļĨāļāļāļāļĢāđāļĄāļĄāļ·āļāļāļ·āļ āđāļĄāļ·āđāļāļāļļāļāļāļĢāļāđāļŠāļđāļāđāļŠāļĩāļĒāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāđāļēāļāļāļ°āļāļ·āļāļāđāļēāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāļāđāļ§āđ āđāļĨāļ°āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāđāļāļĩāļĒāļāļāļ°āđāļāđāļēāļāļīāļ§āļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāļāļāļāļ§āđāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļ°āļāļĨāļąāļāļĄāļē
āļāļĪāļāļīāļāļĢāļĢāļĄāļāļĩāđāđāļāļĢāđāļāđāļŠāļāđāļāđāļāđāļ Flutter āļāļēāļĢāđāļĢāļĩāļĒāļ get() āđāļĨāļ° snapshots() āđāļāļīāļĄāļĒāļąāļāļāļāļāļģāļāļēāļāđāļāđāļāļāļ°āļāļāļāđāļĨāļāđ āļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄ āļĄāļĩāļŠāļāļāļŠāļīāđāļāļāļĩāđāļāđāļāļāļāļīāļāļēāļĢāļāļēāļŠāļģāļŦāļĢāļąāļāđāļāļ production:
- āļāļāļēāļāđāļāļ: Firestore āđāļāļ document āļāļąāđāļāļŦāļĄāļāļāļĩāđāđāļāļĨāđāļāļāļāđāđāļāđāļāđāļēāļ āļŠāļģāļŦāļĢāļąāļāđāļāļāļāļĩāđāļĄāļĩāļāđāļāļĄāļđāļĨāļāļģāļāļ§āļāļĄāļēāļ āđāļŦāđāļāļģāļŦāļāļāļāđāļē
Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED)āļŦāļĢāļ·āļāļāļģāļŦāļāļāļāļĩāļāļāļģāļāļąāļāļāļĩāđāđāļāļāļēāļ°āđāļāļēāļ°āļāļ āļĢāļļāđāļ v6.4.1 āđāļāđāđāļāđāđāļāļāļąāđāļāļāļĩāđāđāļāļāđāļāļāđāļĄāđāļāļģāļāļąāļāđāļĄāđāļāļđāļāļāļģāđāļāđāļāđāļāļĒāđāļēāļāļāļđāļāļāđāļāļāļāļ iOS - āļāļąāļ§āļāđāļāļāļĩāđāļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļĢāļāļāļģāđāļāļīāļāļāļēāļĢ: āđāļāđ
SnapshotMetadata.hasPendingWritesāđāļāļ·āđāļāđāļŠāļāļāđāļŦāđāļāļđāđāđāļāđāļāļĢāļēāļāļ§āđāļēāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļāđāļāļĢāļ·āđāļāļāļĒāļąāļāđāļĄāđāđāļāđāļāļīāļāļāđāđāļāļĒāļąāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ
StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
.collection('tasks')
.doc(taskId)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const CircularProgressIndicator();
final data = snapshot.data!;
final isPending = data.metadata.hasPendingWrites;
return Row(
children: [
Text(data['title']),
if (isPending) const Icon(Icons.cloud_upload, size: 16),
],
);
},
)āļāļēāļĢāļāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļ Flutter Firebase āļŠāļģāļŦāļĢāļąāļ Production
āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāļāļĩāđāļāļĒāļēāļĒāļāļāļēāļāđāļāđāļāļ°āđāļĒāļāļāļĢāļĢāļāļ°āļāļāļ Firebase āļāļāļāļāļēāļāđāļāđāļ UI āļĢāļđāļāđāļāļ repository āļĄāļāļāļāļąāđāļāļāļēāļĢāļāļēāļĄāļāļĢāļĢāļĄāļāļĩāđāļāļąāļāđāļāļāļāļķāđāļāļāđāļ§āļĒāđāļŦāđāļāļēāļĢāļāļāļŠāļāļāđāļĨāļ°āļāļēāļĢāļĒāđāļēāļĒāđāļāđāļāđāļāļāļāđāđāļāļāļāļēāļāļāļāđāļēāļĒāļāļķāđāļ
abstract class TaskRepository {
Future<String> create(String userId, String title);
Stream<List<Task>> watchAll(String userId);
Future<void> update(String id, Map<String, dynamic> fields);
Future<void> delete(String id);
}
// firebase_task_repository.dart
class FirebaseTaskRepository implements TaskRepository {
final _db = FirebaseFirestore.instance;
Future<String> create(String userId, String title) async {
final doc = await _db.collection('tasks').add({
'userId': userId,
'title': title,
'completed': false,
'createdAt': FieldValue.serverTimestamp(),
});
return doc.id;
}
Stream<List<Task>> watchAll(String userId) {
return _db
.collection('tasks')
.where('userId', isEqualTo: userId)
.orderBy('createdAt', descending: true)
.snapshots()
.map((s) => s.docs.map(Task.fromFirestore).toList());
}
// ... update and delete implementations
}āļāđāļ§āļĒāļĢāļđāļāđāļāļāļāļĩāđ āđāļāļĨāļđāļāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢ state āļāļĒāđāļēāļ Riverpod āļŦāļĢāļ·āļ BLoC āļāļ°āđāļāđāļāļīāļāđāļāļāļĢāđāđāļāļ repository āđāļāļĒāđāļĄāđāļāđāļāļāļĢāļđāđāđāļāļĩāđāļĒāļ§āļāļąāļ Firestore āļāļēāļĢāļāļāļŠāļāļāļŦāļāđāļ§āļĒāļŠāļēāļĄāļēāļĢāļāđāļāļāļāļĩāđāļāđāļ§āļĒ mock repository āļāļĩāđāļāļ·āļāļāđāļēāļāđāļāļĄāļđāļĨāļāļĩāđāļāļģāļŦāļāļāđāļ§āđāļĨāđāļ§āļāļŦāļāđāļēāđāļāđ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Flutter Firebase āļāļĩāđāļāļāļāđāļāļĒ
āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļĄāļąāļāļāļāļŠāļāļāļāļąāđāļāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāļīāļāđāļāļ§āļāļīāļāđāļĨāļ°āļāļēāļĢāļāļģāļāļĢāļīāļāļēāļĢ Firebase āđāļāđāļāđāļāļĢāļīāļ āļāļģāļāļēāļĄāļāđāļāđāļāļāļĩāđāļāļĢāļēāļāļāđāļāđāļāļāļĢāļ°āļāļģāđāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļąāļāļāļąāļāļāļē Flutter āđāļāļāļĩ 2026
authStateChanges() āđāļāļāļāđāļēāļāļāļēāļ idTokenChanges() āđāļĨāļ° userChanges() āļāļĒāđāļēāļāđāļĢ?
authStateChanges() āļāļģāļāļēāļāđāļāļāļēāļ°āđāļāđāļŦāļāļļāļāļēāļĢāļāđāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāđāļĨāļ°āļāļāļāļāļēāļāļĢāļ°āļāļāđāļāđāļēāļāļąāđāļ idTokenChanges() āļāļ°āļāļģāļāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāđāļĄāļ·āđāļ ID token āļāļđāļāļĢāļĩāđāļāļĢāļ (āļāļļāļ āđ āļāļĢāļ°āļĄāļēāļ 60 āļāļēāļāļĩ) userChanges() āļāļąāļāļāļļāļāļāļĒāđāļēāļāļāđāļēāļāļāđāļāļĢāļ§āļĄāļāļķāļāļāļēāļĢāļāļąāļāđāļāļāđāļāļĢāđāļāļĨāđāļāļĒāđāļēāļ updateDisplayName() āļŠāļģāļŦāļĢāļąāļ navigation guard āļŠāđāļ§āļāđāļŦāļāđ authStateChanges() āļāđāđāļāļĩāļĒāļāļāļāđāļĨāđāļ§
āđāļāļīāļāļāļ°āđāļĢāļāļķāđāļāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļāļĩāļĒāļ Firestore āļāļāļ°āļāļĩāđāļāļļāļāļāļĢāļāđāļāļāļāđāļĨāļāđ?
āļāļēāļĢāđāļāļĩāļĒāļāļāļ°āļāļđāļāđāļāđāļāđāļ§āđāđāļāđāļāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāđāļĨāļ°āļāļīāļ§āļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļĢāļāļāļģāđāļāļīāļāļāļēāļĢ āļāļąāļ§āļĢāļąāļāļāļąāļ snapshots() āļāļ°āđāļāđāļĢāļąāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļąāļāđāļāļāļāļąāļāļāļĩāļāļĢāđāļāļĄ metadata.hasPendingWrites == true āđāļĄāļ·āđāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļĨāļąāļāļĄāļē Firestore āļāļ°āļāļīāļāļāđāļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļĢāļāļāļģāđāļāļīāļāļāļēāļĢāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļīāļāđāļ§āļĒāļāļēāļĢāđāļāđāđāļāļāđāļāļāļąāļāđāļĒāđāļāđāļāļ last-writer-wins āđāļāļĢāļ°āļāļąāļāļāļīāļĨāļāđ
āļāļ§āļĢāļŠāļĢāđāļēāļāđāļāļāļāļģāļĨāļāļāļāđāļāļĄāļđāļĨ Firestore āļŠāļģāļŦāļĢāļąāļāđāļāļāđāļāļāļāļĒāđāļēāļāđāļĢ?
āđāļāļ§āļāļēāļāļāļĩāđāļāļāļāđāļāļĒ: collection chats āļāļĩāđāđāļāđāļĨāļ° document āļĄāļĩ metadata (āļāļđāđāđāļāđāļēāļĢāđāļ§āļĄ, timestamp āļāļāļāļāđāļāļāļ§āļēāļĄāļĨāđāļēāļŠāļļāļ) āđāļĨāļ° subcollection messages āļ āļēāļĒāđāļāđāđāļāđāļĨāļ° document āļāļāļāđāļāļ āđāļāļĢāļāļŠāļĢāđāļēāļāļāļĩāđāļāđāļ§āļĒāđāļŦāđāļŠāļēāļĄāļēāļĢāļ query āļĢāļēāļĒāļāļēāļĢāđāļāļāļāļāļāļāļđāđāđāļāđāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļāļĢāđāļāļĄāļāļąāđāļāđāļāđāļāļŦāļāđāļēāļāđāļāļāļ§āļēāļĄāļ āļēāļĒāđāļāđāļāđāļĨāļ°āļāļāļŠāļāļāļāļē āļāļ§āļĢ denormalize āļāđāļāļāļ§āļēāļĄāļĨāđāļēāļŠāļļāļāđāļāđāļēāđāļāđāļ document āđāļĄāđ āđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļāđāļēāļ subcollection āļŠāļģāļŦāļĢāļąāļāļĄāļļāļĄāļĄāļāļāļĢāļēāļĒāļāļēāļĢ
āļāļģāđāļĄāļāļķāļāļāļ§āļĢāđāļāđ FieldValue.serverTimestamp() āļĄāļēāļāļāļ§āđāļē DateTime.now()?
DateTime.now() āđāļāđāļāļēāļŽāļīāļāļēāļāļāļāļāļļāļāļāļĢāļāđ āļāļķāđāļāļāļēāļāđāļĄāđāđāļĄāđāļāļĒāļģāļŦāļĢāļ·āļāļāļđāļāļāļąāļāđāļāļĨāļāđāļāđ FieldValue.serverTimestamp() āđāļāđāļāļēāļŽāļīāļāļēāļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ Firestore āļāļķāđāļāļĢāļąāļāļāļĢāļ°āļāļąāļāļĨāļģāļāļąāļāļāļĩāđāļŠāļāļāļāļĨāđāļāļāļāļąāļāđāļāļāļļāļāđāļāļĨāđāļāļāļāđ āļŠāļīāđāļāļāļĩāđāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļāļĩāđāļāļāļĢāđāļāļĒāđāļēāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĨāļģāļāļąāļāļāđāļāļāļ§āļēāļĄ āļāļĩāļāļāļīāļāļāļĢāļĢāļĄ āđāļĨāļ°āļāļąāļāļāļķāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ
āļāļēāļĢ query āđāļāļ composite āļāļąāļāļāļēāļĢāļāļĒāđāļēāļāđāļĢāđāļ Firestore āđāļĨāļ°āļĄāļĩāļāđāļāļāļģāļŦāļāļāđāļĢāļ·āđāļāļ index āļāļĒāđāļēāļāđāļĢ?
Firestore āļāđāļāļāļāļēāļĢ composite index āļŠāļģāļŦāļĢāļąāļ query āļāļĩāđāļĢāļ§āļĄāļŦāļĨāļēāļĒāļāļīāļĨāļāđāļāđāļ§āļĒāļāļāļļāļāļĢāļ°āđāļĒāļ where āđāļĨāļ° orderBy index āđāļāļāļāļīāļĨāļāđāđāļāļĩāļĒāļ§āļāļ°āļāļđāļāļŠāļĢāđāļēāļāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī āđāļāđ composite index āļāđāļāļāļāļđāļāļāļģāļŦāļāļāļāđāļ§āļĒāļāļāđāļāļāđāļ firestore.indexes.json āļŦāļĢāļ·āļāļāđāļēāļ Firebase console Firestore āļāļ°āļāļąāļāļāļķāļāļĨāļīāļāļāđāđāļāļĒāļāļĢāļāđāļāļ·āđāļāļŠāļĢāđāļēāļ index āļāļĩāđāļāļēāļāļŦāļēāļĒāđāļāđāļĄāļ·āđāļ query āļĨāđāļĄāđāļŦāļĨāļ§
āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđ Flutter āđāļāļīāđāļĄāđāļāļīāļĄ āđāļĄāļāļđāļĨāļāļķāļāļāļāđāļāļāļēāļ°āļāļēāļāļāļĢāļāļāļāļĨāļļāļĄāļŦāļąāļ§āļāđāļāđāļŦāļĨāđāļēāļāļĩāđāļāđāļ§āļĒāđāļāļāļāļāļŠāļāļāđāļāļīāļāđāļāđāļāļāļāđāļĨāļ°āļāļ§āļēāļĄāļāđāļēāļāļēāļĒāđāļāļāļāļąāļāđāļ§āļĨāļē
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļāļŠāļĢāļļāļ
- FlutterFire SDK v4.15 āļĄāļēāļāļĢāđāļāļĄāđāļāđāļāđāļāļāļāļĩāđāđāļŠāļāļĩāļĒāļĢāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļ (v6.1.2) āđāļĨāļ° Firestore (v6.4.1) āļāļĢāđāļāļĄāļāļĩāđāļāļāļĢāđāđāļŦāļĄāđāļāļĒāđāļēāļ Firestore Pipelines āđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļĒāļāļēāļĒāļĢāļŦāļąāļŠāļāđāļēāļ
authStateChanges()āļĄāļāļāļŠāļāļĢāļĩāļĄāđāļāļ reactive āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļēāļĢāļŠāļāļēāļāļ°āļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļąāđāļ§āļāļąāđāļāđāļāļāđāļāļĒāđāļĄāđāļāđāļāļāļāļĢāļ§āļāļŠāļāļāļāđāļ§āļĒāļāļāđāļāļ- āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢ CRUD āļāļāļ Firestore āđāļāđāļāđāļāļāļēāļĄāļĢāļđāļāđāļāļāļāļĩāđāđāļĢāļĩāļĒāļāļāđāļēāļĒ:
add,get,update,deleteāļāļāļāļēāļĢāļāđāļēāļāļāļīāļ collection āđāļĨāļ° document - āļāļēāļĢāļāļīāļāđāļāļĢāđāļāļāđāđāļāļāđāļĢāļĩāļĒāļĨāđāļāļĄāđāļāđāļēāļ
snapshots()āļāļāļąāļāļāļēāļĢ polling āđāļĨāļ°āļāļŠāļēāļāļĢāļ§āļĄāđāļāļĒāļāļĢāļāļāļąāļStreamBuilderāđāļāļ·āđāļāļāļēāļĢāļāļąāļāđāļāļ UI āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī - āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāđāļāđāļāļŠāļīāđāļāļāļģāđāļāđāļāļŠāļģāļŦāļĢāļąāļ production āļāļ§āļĢāļāļĢāļ§āļāļŠāļāļ
request.auth.uidāđāļāļĩāļĒāļāļāļąāļāļāļīāļĨāļāđāļāļ§āļēāļĄāđāļāđāļāđāļāđāļēāļāļāļāļāļāļ document āđāļŠāļĄāļ - āļāļēāļĢāļāļāļāļĒāļđāđāđāļāļāļāļāļāđāļĨāļāđāļāļģāļāļēāļāļāļĒāđāļēāļāđāļāļĢāđāļāđāļŠāļāļāļĄāļ·āļāļāļ·āļ āđāļāđ
hasPendingWritesāđāļāļ·āđāļāļŠāļ·āđāļāļŠāļēāļĢāļŠāļāļēāļāļ°āļāļēāļĢāļāļīāļāļāđāđāļŦāđāļāļđāđāđāļāđāļāļĢāļēāļ - āļĢāļđāļāđāļāļ repository āđāļĒāļ Firebase āļāļāļāļāļēāļāļāļĢāļĢāļāļ°āļāļēāļāļāļļāļĢāļāļīāļ āļāļģāđāļŦāđāļāļēāļĢāļāļāļŠāļāļāđāļĨāļ°āļāļēāļĢāļĒāđāļēāļĒāđāļāļāļāļēāļāļāđāļāđāļāđāļĢāļ·āđāļāļāļāđāļēāļĒ
- āļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđāļāļ§āļĢāļāļĢāļāļāļāļĨāļļāļĄāļāļ§āļēāļĄāđāļāļāļāđāļēāļāļāļāļāļŠāļāļĢāļĩāļĄ auth, āļāļĪāļāļīāļāļĢāļĢāļĄāļāļāļāđāļĨāļāđ, āļĢāļđāļāđāļāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļāļģāļĨāļāļāļāđāļāļĄāļđāļĨ āđāļĨāļ°āļāđāļāļāļģāļŦāļāļāļāļāļ composite index
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

20 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Flutter āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāđāļāļāļĄāļ·āļāļāļ·āļ
āđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Flutter āļāđāļ§āļĒāļāļģāļāļēāļĄ 20 āļāđāļāļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒāļāļĩāđāļŠāļļāļ āļāļĢāļāļāļāļĨāļļāļĄ Widget, State Management, Dart, āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ āđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļ āļāļĢāđāļāļĄāļāļģāļāļāļīāļāļēāļĒāļāļĒāđāļēāļāļĨāļ°āđāļāļĩāļĒāļāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

Flutter: āļŠāļĢāđāļēāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļāđāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāļāļąāļ§āđāļĢāļ
āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļĄāļ·āļāļāļ·āļāļāđāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāļāđāļ§āļĒ Flutter āđāļĨāļ° Dart āļāļĢāļāļāļāļĨāļļāļĄ Widget āļāļēāļĢāļāļąāļāļāļēāļĢāļŠāļāļēāļāļ° āļāļēāļĢāļāļģāļāļēāļ āđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļŠāļģāļŦāļĢāļąāļāļāļđāđāđāļĢāļīāđāļĄāļāđāļ

āļāļēāļĢāļāļąāļāļāļēāļĢ State āđāļ Flutter: Riverpod vs BLoC - āļāļđāđāļĄāļ·āļāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ
āļāļēāļĢāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāđāļāļīāļāļĨāļķāļāļĢāļ°āļŦāļ§āđāļēāļ Riverpod āđāļĨāļ° BLoC āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢ state āđāļ Flutter āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļāļāļŠāļāļ āđāļĨāļ°āļāļĢāļāļĩāļāļēāļĢāđāļāđāļāļēāļāđāļāļ·āđāļāđāļĨāļ·āļāļāđāļāļĨāļđāļāļąāļāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļ