← Назад к вопросам

Какие варианты локального хранения данных есть во Flutter?

1.8 Middle🔥 242 комментариев
#Хранение данных

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Варианты локального хранения данных во Flutter

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

1. SharedPreferences — простые ключ-значение

SharedPreferences — это самый простой способ сохранения примитивных данных (строки, числа, булевы значения). Данные хранятся в виде ключ-значение.

import package:shared_preferences/shared_preferences.dart;

// Сохранение
final prefs = await SharedPreferences.getInstance();
await prefs.setString(username, John);
await prefs.setInt(age, 30);
await prefs.setBool(isLoggedIn, true);

// Загрузка
final String? username = prefs.getString(username);
final int? age = prefs.getInt(age);
final bool isLoggedIn = prefs.getBool(isLoggedIn) ?? false;

// Удаление
await prefs.remove(username);

Когда использовать:

  • Сохранение настроек приложения
  • Токены авторизации
  • Флаги (первый запуск, согласие с политикой)
  • Простые пользовательские данные

Плюсы: просто, быстро, встроено Минусы: только примитивные типы, мало данных

2. SQLite Database — структурированные данные

SQLite — это полноценная встроенная SQL база данных. Идеальна для больших объёмов структурированных данных.

import package:sqflite/sqflite.dart;
import package:path/path.dart;

final database = await openDatabase(
  join(await getDatabasesPath(), app_db.db),
  onCreate: (db, version) {
    return db.execute(
      CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, email TEXT),
    );
  },
  version: 1,
);

// Вставка
await database.insert(
  users,
  {name: John, email: john@example.com},
  conflictAlgorithm: ConflictAlgorithm.replace,
);

// Чтение
final List<Map<String, dynamic>> users = await database.query(users);

// Обновление
await database.update(
  users,
  {name: Jane},
  where: id = ?,
  whereArgs: [1],
);

// Удаление
await database.delete(users, where: id = ?, whereArgs: [1]);

Когда использовать:

  • Локальный кеш данных с сервера
  • Записи, заметки, история
  • Офлайн-первые приложения
  • Большие объёмы структурированных данных

Плюсы: мощная, ACID, быстрая индексация Минусы: требует схемы, нужна миграция данных

3. Hive — быстрое NoSQL хранилище

Hive — это лёгкая NoSQL база данных, написанная на Dart. Хранит данные в бинарном формате.

import package:hive/hive.dart;

// Открытие бокса (аналог коллекции)
var box = await Hive.openBox(users);

// Сохранение
await box.put(user_1, {
  name: John,
  email: john@example.com,
  age: 30,
});

// Загрузка
final user = box.get(user_1);
print(user[name]); // John

// Итерация
for (var key in box.keys) {
  final user = box.get(key);
  print(user[name]);
}

// Удаление
await box.delete(user_1);

Когда использовать:

  • Кеширование JSON с API
  • Списки задач, заметки
  • Профилирование приложения
  • Когда нужна скорость и простота

Плюсы: быстро, типизировано, поддерживает сложные объекты Минусы: меньше конфигурации, чем SQLite

4. GetStorage — ультра-простое хранилище

GetStorage — это библиотека от Get пакета для минималистичного хранения данных.

import package:get_storage/get_storage.dart;

await GetStorage.init();
final box = GetStorage();

// Сохранение
box.write(user_name, John);
box.write(user_data, {age: 30, city: NYC});

// Загрузка
final String? name = box.read(user_name);
final Map? userData = box.read(user_data);

// Удаление
box.remove(user_name);

Когда использовать:

  • Очень простые данные
  • Проекты на Get пакете

Плюсы: минимальный код Минусы: меньше возможностей

5. File System — произвольные файлы

Для сохранения изображений, документов или произвольных бинарных данных используется файловая система.

import dart:io;
import package:path_provider/path_provider.dart;

// Получить документы директорию
final dir = await getApplicationDocumentsDirectory();
final file = File(${dir.path}/data.txt);

// Запись
await file.writeAsString(Hello, World!);

// Чтение
final contents = await file.readAsString();

// Проверка существования
if (await file.exists()) {
  print(Файл существует);
}

// Удаление
await file.delete();

Когда использовать:

  • Сохранение изображений
  • Кеширование файлов
  • Экспорт данных (PDF, CSV)

Плюсы: полная контроль Минусы: нужно управлять путями

6. Firebase Realtime Database / Firestore — облачное хранилище

Для синхронизации данных между устройствами.

import package:cloud_firestore/cloud_firestore.dart;

final db = FirebaseFirestore.instance;

// Сохранение
await db.collection(users).doc(user_1).set({
  name: John,
  email: john@example.com,
});

// Чтение
final doc = await db.collection(users).doc(user_1).get();
print(doc.data());

// Слушание изменений (реал-тайм)
db.collection(users).snapshots().listen((snapshot) {
  for (var doc in snapshot.docs) {
    print(doc.data());
  }
});

Сравнительная таблица

ХранилищеТип данныхРазмерСкоростьСтруктураСложность
SharedPreferencesПримитивыMBОчень быстроПлоскаяОчень низкая
SQLiteТаблицыGBБыстроSQLСредняя
HiveОбъектыGBОчень быстроNoSQLНизкая
GetStorageПримитивыMBОчень быстроПлоскаяМинимальная
File SystemФайлыGBЗависитПроизвольнаяСредняя
FirebaseОблакоНеограниченоСетевоеNoSQLСредняя

Рекомендации по выбору

Используй SharedPreferences для:

  • Настроек (тема, язык)
  • Простых флагов
  • Токенов авторизации

Используй SQLite для:

  • Больших объёмов структурированных данных
  • Когда нужны запросы и связи между таблицами
  • Офлайн-функционала

Используй Hive для:

  • Быстрого кеширования JSON
  • Типизированных объектов
  • Когда простоты и скорости

Используй файлы для:

  • Изображений и медиа
  • Документов и отчётов

Вывод: Выбор хранилища зависит от типа данных. Для простоты — SharedPreferences, для структуры — SQLite, для скорости и гибкости — Hive.

Какие варианты локального хранения данных есть во Flutter? | PrepBro