Kodokon kodokon.com

shared_preferences के साथ स्थानीय परसिस्टेंस

shared_preferences की सुरक्षा और आयतन सीमाओं को जानते हुए इसके साथ प्राथमिकताओं और हल्के डेटा को परसिस्ट करें।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

shared_preferences एक की/वैल्यू स्टोर है जो नेटिव तंत्रों (Android पर SharedPreferences, iOS पर UserDefaults) द्वारा समर्थित है। इसका सबसे उपयुक्त स्थान: छोटा डेटा - चुनी गई थीम, देखा गया ऑनबोर्डिंग, अंतिम सक्रिय टैब। इससे आगे, उपकरण बदलें: बड़े या क्वेरी-योग्य डेटा के लिए sqflite या drift डेटाबेस, किसी भी संवेदनशील चीज़ के लिए flutter_secure_storage। फ़ाइल पूरी तरह मेमोरी में लोड की जाती है: यह न तो एन्क्रिप्टेड है और न ही बढ़ने के लिए बनाई गई है।

BASH
flutter pub add shared_preferences

getInstance() पहली कॉल पर एसिंक्रोनस होता है (फ़ाइल पढ़ना), फिर एक कैश किया गया इंस्टेंस लौटाता है: उसके बाद की get* कॉल सिंक्रोनस होती हैं, मेमोरी से परोसी जाती हैं। दूसरी ओर, set* कॉल डिस्क पर एसिंक्रोनस रूप से लिखती हैं। व्यवहार में, की स्ट्रिंग को पूरे एप्लिकेशन में बिखेरें नहीं: उन्हें एक टाइप किए गए, इंजेक्ट करने योग्य, परीक्षण योग्य रैपर में केंद्रीकृत करें।

DART
import 'package:shared_preferences/shared_preferences.dart';

class SettingsStore {
  SettingsStore(this._prefs);

  static const _darkModeKey = 'settings.darkMode';

  final SharedPreferences _prefs;

  static Future<SettingsStore> load() async {
    final prefs = await SharedPreferences.getInstance();
    return SettingsStore(prefs);
  }

  bool get darkMode =>
      _prefs.getBool(_darkModeKey) ?? false;

  Future<void> setDarkMode(bool value) =>
      _prefs.setBool(_darkModeKey, value);
}
केंद्रीकृत की, गारंटीशुदा टाइप, इंजेक्ट करने योग्य डिपेंडेंसी।

यह API केवल प्रिमिटिव टाइप संग्रहीत करता है: bool, int, double, String, और List<String>। किसी संरचित ऑब्जेक्ट के लिए, इसे JSON में सीरियलाइज़ करें - पहले पाठ के आपके toJson/fromJson यहाँ फिर से काम आते हैं। एक स्वीकृत समझौता: हर सेव पूरी वैल्यू को फिर से लिखता है और कोई क्वेरी संभव नहीं है। किसी ड्राफ़्ट के लिए एकदम सही, किसी इतिहास के लिए अनुपयुक्त।

DART
import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

class Draft {
  const Draft({required this.title, required this.body});

  factory Draft.fromJson(Map<String, dynamic> json) =>
      Draft(
        title: json['title'] as String,
        body: json['body'] as String,
      );

  final String title;
  final String body;

  Map<String, dynamic> toJson() =>
      {'title': title, 'body': body};
}

Future<void> saveDraft(Draft draft) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('draft', jsonEncode(draft));
}

Future<Draft?> loadDraft() async {
  final prefs = await SharedPreferences.getInstance();
  final raw = prefs.getString('draft');
  if (raw == null) return null;
  return Draft.fromJson(
    jsonDecode(raw) as Map<String, dynamic>,
  );
}
एक संपूर्ण ऑब्जेक्ट एक साधारण JSON स्ट्रिंग के रूप में संग्रहीत।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. कौन सा डेटा shared_preferences में रखा जाना चाहिए?
    • उपयोगकर्ता का प्रमाणीकरण टोकन।
    • उपयोगकर्ता का 50,000 लेन-देन का संपूर्ण इतिहास।
    • डार्क थीम का चुनाव।
  2. पहली getInstance() के बाद, get* पठन कैसा व्यवहार करते हैं?
    • हर पठन फ़ाइल को डिस्क से दोबारा पढ़ता है।
    • वे सिंक्रोनस हैं: वैल्यू एक मेमोरी कैश से परोसी जाती हैं।
    • वे Future लौटाते हैं जिनकी आपको हर बार प्रतीक्षा करनी पड़ती है।
  3. आप किसी संरचित Draft ऑब्जेक्ट को कैसे सेव करते हैं?
    • इसे jsonEncode के साथ JSON में सीरियलाइज़ करें और setString के ज़रिए संग्रहीत करें।
    • इस उद्देश्य के लिए बने prefs.setObject('draft', draft) का उपयोग करें।
    • इसे फ़ील्ड-दर-फ़ील्ड setStringList में बाँट दें।