Flutter Shared Preferences

Simple key-value storage for Flutter apps

💾 What is Shared Preferences?

Shared Preferences is a simple key-value storage solution for Flutter apps. It's perfect for storing small amounts of data like user settings, preferences, and simple app states persistently across app sessions.


// Add to pubspec.yaml
dependencies:
  shared_preferences: ^2.2.2

// Basic usage
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', 'John');
                                    

Key Features

🔑

Key-Value Pairs

Store data using simple keys

prefs.setString('name', 'Alice');
📱

Platform Native

Uses native storage on each platform

// iOS: NSUserDefaults
// Android: SharedPreferences
âš¡

Fast & Simple

Quick access to stored data

String? name = prefs.getString('name');
🔄

Persistent

Data survives app restarts

await prefs.setBool('isDarkMode', true);

🔹 Installation

Add the package to your Flutter project:

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2

Run flutter pub get after adding the dependency

🔹 Saving Data

Store different types of data:

import 'package:shared_preferences/shared_preferences.dart';

Future<void> saveUserData() async {
  final prefs = await SharedPreferences.getInstance();
  
  // Save String
  await prefs.setString('username', 'JohnDoe');
  
  // Save int
  await prefs.setInt('age', 25);
  
  // Save bool
  await prefs.setBool('isLoggedIn', true);
  
  // Save double
  await prefs.setDouble('rating', 4.5);
  
  // Save List of Strings
  await prefs.setStringList('favorites', ['Apple', 'Banana', 'Orange']);
}

Result:

✅ Data saved successfully to device storage

🔹 Reading Data

Retrieve stored data from preferences:

Future<void> readUserData() async {
  final prefs = await SharedPreferences.getInstance();
  
  // Read String (returns null if not found)
  String? username = prefs.getString('username');
  
  // Read int with default value
  int age = prefs.getInt('age') ?? 0;
  
  // Read bool
  bool isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
  
  // Read double
  double rating = prefs.getDouble('rating') ?? 0.0;
  
  // Read List of Strings
  List<String>? favorites = prefs.getStringList('favorites');
  
  print('Username: $username');
  print('Age: $age');
  print('Logged in: $isLoggedIn');
}

Output:

Username: JohnDoe
Age: 25
Logged in: true

🔹 Complete Example

A simple counter app using Shared Preferences:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class CounterPage extends StatefulWidget {
  @override
  _CounterPageState createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int _counter = 0;

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  Future<void> _loadCounter() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = prefs.getInt('counter') ?? 0;
    });
  }

  Future<void> _incrementCounter() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter++;
    });
    await prefs.setInt('counter', _counter);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter App')),
      body: Center(
        child: Text('Count: $_counter', style: TextStyle(fontSize: 24)),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        child: Icon(Icons.add),
      ),
    );
  }
}

Result:

📱 Counter persists even after closing the app!

🔹 Removing Data

Delete specific keys or clear all data:

Future<void> removeData() async {
  final prefs = await SharedPreferences.getInstance();
  
  // Remove specific key
  await prefs.remove('username');
  
  // Clear all data
  await prefs.clear();
  
  // Check if key exists
  bool hasKey = prefs.containsKey('username');
  print('Has username: $hasKey');
}

🔹 Best Practices

  • Small Data Only: Use for settings, not large datasets
  • Not Secure: Don't store sensitive data like passwords
  • Use Constants: Define keys as constants to avoid typos
  • Handle Nulls: Always provide default values when reading
  • Async Operations: Remember all operations are asynchronous

🧠 Test Your Knowledge

What type of data is Shared Preferences best for?