Что такое SharedPreferences в контексте Flutter/Dart?

Ответ

SharedPreferences — это плагин для Flutter, предоставляющий простой механизм хранения данных в формате ключ-значение для сохранения примитивных типов (int, double, bool, String, List) между запусками приложения. Под капотом он использует нативные API: NSUserDefaults на 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 или найти спец. пакеты. А так — хуй с горы, работает и ладно.