Ứng dụng cần nhớ dữ liệu khi tắt mở lại. Bài này giới thiệu các cách lưu trữ: shared_preferences cho cài đặt, SQLite/Drift cho dữ liệu có cấu trúc, lưu trữ bảo mật cho token, và kết nối Firebase/Supabase.
- Lưu cài đặt bằng shared_preferences
- Lưu dữ liệu bảng bằng sqflite
- Lưu token an toàn
- Biết lựa chọn backend đám mây
- Key-value
- Lưu cặp khóa – giá trị đơn giản.
- SQLite
- CSDL quan hệ nhúng trong ứng dụng.
- Keychain/Keystore
- Kho bảo mật của iOS/Android.
- BaaS
- Backend as a Service: Firebase, Supabase.
Khái niệm và lý thuyết
| Nhu cầu | Giải pháp |
|---|---|
| Cài đặt, cờ đã xem giới thiệu | shared_preferences |
| Danh sách ghi chú, đơn hàng ngoại tuyến | sqflite, Drift (SQLite có kiểu) |
| Token, mật khẩu | flutter_secure_storage |
| Đồng bộ nhiều thiết bị, đăng nhập | Firebase, Supabase |
Mọi thao tác lưu trữ đều bất đồng bộ (trả về Future) vì đọc ghi đĩa có thể chậm. Nguyên tắc bảo mật: không bao giờ lưu mật khẩu hay token trong shared_preferences vì đó là tệp văn bản thường.
shared_preferences
flutter pub add shared_preferencesfinal prefs = SharedPreferencesAsync();
await prefs.setBool('cheDoToi', true);
final toi = await prefs.getBool('cheDoToi') ?? false;SQLite với sqflite
flutter pub add sqflite pathfinal db = await openDatabase(
join(await getDatabasesPath(), 'ghichu.db'),
version: 1,
onCreate: (db, v) => db.execute(
'CREATE TABLE ghichu(id INTEGER PRIMARY KEY AUTOINCREMENT, tieuDe TEXT, noiDung TEXT)'),
);
await db.insert('ghichu', {'tieuDe': 'Học Flutter', 'noiDung': 'Bài 11'});
final ds = await db.query('ghichu', orderBy: 'id DESC');
await db.update('ghichu', {'tieuDe': 'Đã học'}, where: 'id = ?', whereArgs: [1]);
await db.delete('ghichu', where: 'id = ?', whereArgs: [1]);Luôn dùng whereArgs thay vì nối chuỗi để tránh lỗi SQL injection.
Lưu token an toàn
const storage = FlutterSecureStorage();
await storage.write(key: 'token', value: token);
final t = await storage.read(key: 'token');Backend đám mây
Firebase (Google): Authentication, Cloud Firestore, Storage, Cloud Messaging; cấu hình bằng flutterfire configure. Supabase: mã nguồn mở, dùng PostgreSQL, có gói supabase_flutter, hợp với người đã biết SQL. Cả hai đều có gói miễn phí đủ cho đồ án sinh viên.
Gói các thao tác CSDL vào một lớp GhiChuRepository; giao diện chỉ gọi repository, sau này đổi SQLite sang Supabase không phải sửa giao diện.
Khi đổi cấu trúc bảng, tăng version và viết onUpgrade; nếu không, người dùng bản cũ sẽ bị lỗi vì bảng thiếu cột.
- Lưu lựa chọn chế độ tối bằng shared_preferences, mở lại ứng dụng vẫn giữ.
- Làm ứng dụng ghi chú: thêm, sửa, xóa, liệt kê bằng sqflite.
- Tách code CSDL vào lớp repository.
- Tìm hiểu và tạo dự án Firebase hoặc Supabase thử đăng nhập email.
- shared_preferences cho cài đặt nhỏ.
- SQLite cho dữ liệu có cấu trúc ngoại tuyến.
- flutter_secure_storage cho dữ liệu nhạy cảm.
- Firebase/Supabase cho đồng bộ và đăng nhập.