التخزين المحلي — أساسيات Flutter
التخزين المحلي في Flutter
1. SharedPreferences
dependencies:
shared_preferences: ^2.2.0
import 'package:shared_preferences/shared_preferences.dart';
class LocalStorage {
static SharedPreferences? _prefs;
static Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
}
// حفظ قيم
static Future<void> setString(String key, String value) async {
await _prefs?.setString(key, value);
}
static Future<void> setInt(String key, int value) async {
await _prefs?.setInt(key, value);
}
static Future<void> setBool(String key, bool value) async {
await _prefs?.setBool(key, value);
}
static Future<void> setStringList(String key, List<String> value) async {
await _prefs?.setStringList(key, value);
}
// قراءة قيم
static String? getString(String key) => _prefs?.getString(key);
static int? getInt(String key) => _prefs?.getInt(key);
static bool? getBool(String key) => _prefs?.getBool(key);
static List<String>? getStringList(String key) => _prefs?.getStringList(key);
// حذف
static Future<void> remove(String key) async {
await _prefs?.remove(key);
}
static Future<void> clear() async {
await _prefs?.clear();
}
}
// في main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await LocalStorage.init();
runApp(MyApp());
}
// الاستخدام
await LocalStorage.setString('username', 'أحمد');
final username = LocalStorage.getString('username');
2. حفظ كائنات JSON
import 'dart:convert';
class UserPrefs {
static const _userKey = 'user_data';
static Future<void> saveUser(User user) async {
final json = jsonEncode(user.toJson());
await LocalStorage.setString(_userKey, json);
}
static User? getUser() {
final json = LocalStorage.getString(_userKey);
if (json != null) {
return User.fromJson(jsonDecode(json));
}
return null;
}
static Future<void> clearUser() async {
await LocalStorage.remove(_userKey);
}
}
3. Hive (أسرع وأقوى)
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
hive_generator: ^2.0.0
build_runner: ^2.4.0
import 'package:hive_flutter/hive_flutter.dart';
// تهيئة
void main() async {
await Hive.initFlutter();
// تسجيل Adapters
Hive.registerAdapter(UserAdapter());
// فتح Box
await Hive.openBox<User>('users');
await Hive.openBox('settings');
runApp(MyApp());
}
// Model مع Hive
part 'user.g.dart';
@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
String name;
@HiveField(1)
String email;
@HiveField(2)
int age;
User({
required this.name,
required this.email,
required this.age,
});
}
// توليد الـ adapter
// flutter packages pub run build_runner build
// الاستخدام
class UserStorage {
final Box<User> _box = Hive.box<User>('users');
// إضافة
Future<void> addUser(User user) async {
await _box.add(user);
}
// إضافة بمفتاح
Future<void> putUser(String key, User user) async {
await _box.put(key, user);
}
// قراءة
User? getUser(String key) {
return _box.get(key);
}
// قراءة الكل
List<User> getAllUsers() {
return _box.values.toList();
}
// تحديث
Future<void> updateUser(int index, User user) async {
await _box.putAt(index, user);
}
// حذف
Future<void> deleteUser(String key) async {
await _box.delete(key);
}
// الاستماع للتغييرات
ValueListenable<Box<User>> get listenable => _box.listenable();
}
// مع ValueListenableBuilder
ValueListenableBuilder<Box<User>>(
valueListenable: Hive.box<User>('users').listenable(),
builder: (context, box, _) {
final users = box.values.toList();
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(users[index].name),
subtitle: Text(users[index].email),
);
},
);
},
)
4. Flutter Secure Storage (للبيانات الحساسة)
dependencies:
flutter_secure_storage: ^9.0.0
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class SecureStorage {
static const _storage = FlutterSecureStorage(
aOptions: AndroidOptions(encryptedSharedPreferences: true),
iOptions: IOSOptions(accessibility: KeychainAccessibility.first_unlock),
);
static Future<void> setToken(String token) async {
await _storage.write(key: 'auth_token', value: token);
}
static Future<String?> getToken() async {
return await _storage.read(key: 'auth_token');
}
static Future<void> deleteToken() async {
await _storage.delete(key: 'auth_token');
}
static Future<void> clearAll() async {
await _storage.deleteAll();
}
}
5. مثال: نظام Auth كامل
class AuthService {
final _secureStorage = SecureStorage();
final _userPrefs = UserPrefs();
Future<bool> login(String email, String password) async {
try {
final response = await api.post('/login', {
'email': email,
'password': password,
});
// حفظ Token بشكل آمن
await _secureStorage.setToken(response['token']);
// حفظ بيانات المستخدم
final user = User.fromJson(response['user']);
await _userPrefs.saveUser(user);
return true;
} catch (e) {
return false;
}
}
Future<void> logout() async {
await _secureStorage.deleteToken();
await _userPrefs.clearUser();
}
Future<bool> isLoggedIn() async {
final token = await _secureStorage.getToken();
return token != null;
}
User? getCurrentUser() {
return _userPrefs.getUser();
}
}
اختبر فهمك