Local Storage in Flutter
Sometimes you need to persist small pieces of data between app launches — like user preferences, login tokens, or a simple flag. The shared_preferences package is perfect for this.
Add it to your pubspec.yaml:
dependencies:
shared_preferences: ^2.2.0
Saving data is simple key-value pairs:
import 'package:shared_preferences/shared_preferences.dart';
// Save data
Future<void> saveUserData(String name, bool isDarkMode) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', name);
await prefs.setBool('darkMode', isDarkMode);
await prefs.setInt('loginCount', 0);
await prefs.setStringList('favorites', ['flutter', 'dart']);
}
Reading data back works the same way. You can set default values if the key doesn't exist yet:
Future<Map<String, dynamic>> loadUserData() async {
final prefs = await SharedPreferences.getInstance();
return {
'username': prefs.getString('username') ?? 'Guest',
'darkMode': prefs.getBool('darkMode') ?? false,
'loginCount': prefs.getInt('loginCount') ?? 0,
'favorites': prefs.getStringList('favorites') ?? [],
};
}
Removing data is just as easy:
Future<void> clearUserData() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('username');
await prefs.remove('darkMode');
// Or clear everything
await prefs.clear();
}
Let's see a practical example — toggling dark mode:
class ThemeProvider extends ChangeNotifier {
bool _isDarkMode = false;
bool get isDarkMode => _isDarkMode;
ThemeProvider() {
_loadTheme();
}
Future<void> _loadTheme() async {
final prefs = await SharedPreferences.getInstance();
_isDarkMode = prefs.getBool('darkMode') ?? false;
notifyListeners();
}
Future<void> toggleTheme() async {
_isDarkMode = !_isDarkMode;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('darkMode', _isDarkMode);
notifyListeners();
}
}
When should you use local storage vs a database? Use shared_preferences for small data like settings, preferences, and tokens. Use a database like sqflite or drift when you need to store structured data, query records, or handle larger datasets.