Какие варианты локального хранения данных есть во Flutter?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Варианты локального хранения данных во 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.