Labs ICT
Pro Login

Local Storage

Saving data on the device.

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.

Try it Yourself ->