Какие способы хранения данных в Flutter приложении ты знаешь?

Ответ

Выбор способа хранения зависит от типа данных, объёма и требований к производительности. Вот основные варианты:

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 — для всяких пользовательских настроек, типа темы или языка. Главное — не пытайся всё впихнуть в одно решение, а то получится пиздопроебибна архитектура, которую потом сам же и проклянёшь.