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