Ответ
SharedPreferences — это плагин для Flutter, предоставляющий простой механизм хранения данных в формате ключ-значение для сохранения примитивных типов (int, double, bool, String, ListNSUserDefaults на iOS и SharedPreferences на Android.
Основные характеристики:
- Простота: API для чтения/записи похож на
Map<String, dynamic>. - Сохранение состояния: Данные сохраняются на диске после закрытия приложения.
- Асинхронность: Все операции являются асинхронными (
Future). - Ограничения: Не подходит для хранения больших объемов данных или сложных структур (используйте для этого базы данных, например,
sqfliteилиhive).
Типичный сценарий использования — сохранение настроек пользователя:
import 'package:shared_preferences/shared_preferences.dart';
class SettingsService {
static const _darkModeKey = 'dark_mode';
Future<bool> isDarkModeEnabled() async {
final prefs = await SharedPreferences.getInstance();
// Возвращаем значение или false по умолчанию
return prefs.getBool(_darkModeKey) ?? false;
}
Future<void> setDarkMode(bool enabled) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_darkModeKey, enabled);
}
}
Важные замечания:
- Не используйте SharedPreferences для чувствительных данных (пароли, токены). Для этого существуют плагины безопасного хранения, например,
flutter_secure_storage. - Частые операции записи могут влиять на производительность.
- Для реактивной привязки данных к UI можно обернуть вызовы SharedPreferences в
Streamили использовать пакеты вродеshared_preferences_wrapper.
Ответ 18+ 🔞
Э, слушай, смотри, вот тебе история про эту штуку — SharedPreferences. Представь себе такую тумбочку в приложении, куда ты кидаешь всякую ерунду, чтобы не забыть. Типа «включена ли тёмная тема» или «последний логин пользователя». Всё просто, как три копейки: ключ и значение. Под капотом, конечно, там не просто тумбочка, а целые нативные API шуршат — на iOS это NSUserDefaults, на Android — свои SharedPreferences. Но тебе, в принципе, да похуй, как оно внутри работает, главное — сохраняет.
Что это за зверь такой:
- Проще пареной репы: обращаешься с ней как с обычной мапой —
ключ-значение. Никаких ебушки-воробушки с настройками. - Память, как у слона: закрыл приложение, а данные на месте. Не то что некоторые распиздяи, которые всё теряют.
- Не тормозит (в основном): все операции асинхронные, через
Future, так что интерфейс не встанет колом. - Но не всесильна! Это тебе не база данных. Не пытайся запихнуть туда фотки всех котиков из инстаграма — доверия ебать ноль к такому использованию. Для этого есть
sqfliteилиhive. А здесь только примитивы:int,bool,Stringи список строк.
Вот, смотри, как это обычно юзают, чтобы, например, тему переключать:
import 'package:shared_preferences/shared_preferences.dart';
class SettingsService {
static const _darkModeKey = 'dark_mode';
Future<bool> isDarkModeEnabled() async {
final prefs = await SharedPreferences.getInstance();
// Если ничего не нашли, возвращаем false — светлая тема по умолчанию
return prefs.getBool(_darkModeKey) ?? false;
}
Future<void> setDarkMode(bool enabled) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_darkModeKey, enabled);
}
}
А теперь, блядь, важные моменты, чтобы не обжечься:
- Это не сейф! Никаких паролей или токенов сюда пихать нельзя — терпения ноль ебать у взломщиков. Для секретов есть
flutter_secure_storage. - Если будешь писать туда каждую миллисекунду, то, конечно, подозрение ебать чувствую, что приложение начнёт подтупливать.
- Чтобы данные в интерфейсе сами обновлялись, можно завернуть всё это дело в
Streamили найти спец. пакеты. А так — хуй с горы, работает и ладно.