Kodax

التخزين المحلي — أساسيات 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();
  }
}
اختبر فهمك