Aplikacje często muszą przechowywać dane lokalnie na urządzeniu — preferencje użytkownika, dane z pamięci podręcznej, treść offline. Flutter oferuje kilka opcji — shared_preferences (klucz-wartość), SQLite (relacyjna) i inne — każda dostosowana do różnych potrzeb.
Opcje przechowywania lokalnego
SHARED_PREFERENCES → simple KEY-VALUE storage (settings, flags, small data):
→ store primitives (strings, ints, bools) — like a simple persistent map
→ for: user preferences, tokens, simple flags (NOT large/structured data)
SQLITE (sqflite) → a full relational DATABASE on the device:
→ tables, SQL queries — for STRUCTURED, larger data; complex queries; relationships
HIVE / ISAR → fast NoSQL local databases (key-value/object stores) — popular, fast,
Dart-native (no SQL); good for structured local data
FILE storage → read/write files directly (path_provider for directories)
SECURE storage → flutter_secure_storage for SENSITIVE data (tokens, credentials) —
encrypted (keychain/keystore)
Przykład shared_preferences
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', 'Ann'); // store
final name = prefs.getString('username'); // retrieve
await prefs.setBool('darkMode', true);
Wybór odpowiedniej opcji
Simple settings/flags → shared_preferences (easy key-value)
Structured/large data, queries → SQLite (sqflite) or Hive/Isar
Sensitive data (tokens, passwords) → flutter_secure_storage (ENCRYPTED — don't put
secrets in shared_preferences, which is NOT secure)
Files → file storage (path_provider)
→ Match the storage to the data's size, structure, and sensitivity.
Dlaczego to ważne
Zrozumienie sposobu persystowania danych lokalnie jest wartościowe, ponieważ aplikacje powszechnie muszą przechowywać dane na urządzeniu — preferencje użytkownika, dane z pamięci podręcznej, zawartość offline, tokeny uwierzytelniania — dlatego jest to użyteczna praktyczna wiedza do budowania aplikacji.
Persystencja lokalna jest niemal uniwersalną potrzebą (zapamiętywanie ustawień, buforowanie do użytku offline, przechowywanie danych sesji), a Flutter oferuje kilka opcji dostosowanych do różnych potrzeb.
Zrozumienie opcji — shared_preferences (proste przechowywanie klucz-wartość dla ustawień, flag i małych danych), SQLite/sqflite (pełna relacyjna baza danych dla strukturalnych, większych danych z zapytaniami i relacjami), Hive/Isar (szybkie natywne bazy danych NoSQL oparte na Dart, popularne do strukturalnych danych lokalnych), przechowywanie plików i bezpieczne przechowywanie (flutter_secure_storage dla danych wrażliwych) — oraz kiedy używać każdej z nich to kluczowa wiedza.
Wybór odpowiedniej opcji ma znaczenie: shared_preferences dla prostych ustawień, SQLite lub Hive/Isar dla danych strukturalnych/dużych, przechowywanie plików dla plików oraz crucially bezpieczne przechowywanie danych wrażliwych takich jak tokeny i poświadczenia (które muszą być zaszyfrowane przez keychain/keystore platformy — ważny punkt bezpieczeństwa, ponieważ shared_preferences nie jest bezpieczny i nie powinien przechowywać sekretów, częsty błąd).
Dopasowanie przechowywania do rozmiaru, struktury i wrażliwości danych odzwierciedla rozsądne decyzje i unika problemów (takich jak użycie niewłaściwego narzędzia do zadania lub niezabezpieczone przechowywanie poświadczeń).
Ponieważ aplikacje powszechnie potrzebują persystencji lokalnej (ustawienia, buforowanie, dane offline, tokeny) a Flutter oferuje kilka opcji dla różnych potrzeb, oraz ponieważ zrozumienie ich i odpowiedni wybór (szczególnie używanie bezpiecznego przechowywania dla danych wrażliwych) jest wartościowe do poprawnego budowania aplikacji, zrozumienie persystencji danych lokalnych w Flutter jest cenną, praktycznie istotną wiedzą — powszechną potrzebą w rzeczywistych aplikacjach, istotną zarówno dla funkcjonalności (przechowywanie właściwych danych właściwym sposobem) jak i bezpieczeństwa (ochrona wrażliwych danych za pomocą bezpiecznego przechowywania) oraz użyteczną umiejętnością do budowania aplikacji, które zapamiętują stan i działają offline.
