Ответ
Выбор способа хранения зависит от типа данных, объёма и требований к производительности. Вот основные варианты:
1. Для простых пар «ключ-значение» (настройки, флаги):
- SharedPreferences (пакет
shared_preferences).final prefs = await SharedPreferences.getInstance(); await prefs.setInt('counter', 10); final value = prefs.getInt('counter') ?? 0;
2. Для структурированных реляционных данных:
- SQLite через пакет
sqflite.final db = await openDatabase('my_db.db'); await db.execute('CREATE TABLE Users(id INTEGER PRIMARY KEY, name TEXT)'); await db.insert('Users', {'name': 'Alice'});
3. Для быстрого локального хранения объектов:
- Hive — NoSQL-хранилище, не требуюсее сериализации и очень быстрое.
await Hive.initFlutter(); var box = await Hive.openBox('userBox'); box.put('user', User(name: 'Bob')); // User должен быть адаптером Hive var user = box.get('user');
4. Для файлового хранения:
- Использование
dart:ioиpath_providerдля получения путей.final dir = await getApplicationDocumentsDirectory(); final file = File('${dir.path}/data.txt'); await file.writeAsString('Hello World');
5. Для облачной синхронизации:
- Firebase Firestore или Realtime Database.
- REST API с собственным бэкендом.
В реальных проектах часто комбинируют подходы: Hive для кеша офлайн-данных, SQLite для сложных запросов, а SharedPreferences — для настроек.
Ответ 18+ 🔞
Давай разберём эту всю хрень с хранилищами во Flutter, а то у некоторых уже глаза на лоб лезут от выбора. Ситуация, блядь, как в магазине: овердохуища всего, а что брать — хуй поймёшь.
1. Для всякой ерунды типа настроек или флажков:
Тут даже думать не надо — SharedPreferences (это пакет shared_preferences). Просто как два пальца обоссать. Записал ключ, получил значение, и волнение ебать — всё работает.
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('counter', 10);
final value = prefs.getInt('counter') ?? 0;
2. Если тебе надо реляционные данные хранить, с таблицами, связями и прочей хуйнёй:
Берёшь SQLite через sqflite. Да, придётся SQL-запросы писать, но зато мощно, гибко, и доверия ебать — стопицот лет технологии.
final db = await openDatabase('my_db.db');
await db.execute('CREATE TABLE Users(id INTEGER PRIMARY KEY, name TEXT)');
await db.insert('Users', {'name': 'Alice'});
3. А вот если тебе надо быстро, очень быстро, и чтобы объекты тупо-блять-вставлялись без всей этой сериализации: Тогда, ёпта, Hive — это твой выбор. NoSQL-хранилище, которое работает как сумасшедшее. Открыл коробку, запихнул объект, достал — и ни хуя себе, он уже там.
await Hive.initFlutter();
var box = await Hive.openBox('userBox');
box.put('user', User(name: 'Bob')); // User должен быть адаптером Hive
var user = box.get('user');
4. Ну а если тебе по старинке, в файлы писать:
Используй dart:io с path_provider. Получил путь к документам, создал файл, написал в него что хотел. Проще пареной репы, хотя и не всегда удобно.
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/data.txt');
await file.writeAsString('Hello World');
5. Если твоё приложение должно синхронизироваться с облаком: Тут уже варианты. Либо Firebase (Firestore или Realtime Database), либо свой бэкенд через REST API. Выбор зависит от того, готов ли ты платить за удобство или хочешь контролировать всё сам.
В общем, чувак, в реальных проектах обычно эту всю хуйню комбинируют. Например, Hive — для быстрого кеша и офлайн-данных, SQLite — когда нужны сложные запросы и связи, а SharedPreferences — для всяких пользовательских настроек, типа темы или языка. Главное — не пытайся всё впихнуть в одно решение, а то получится пиздопроебибна архитектура, которую потом сам же и проклянёшь.