Labs ICT
⭐ Pro Login

Local Storage

Saving data on the device.

2 min read | Flutter Tutorial
⭐

Want the full learning experience?

Get structured courses, certificates, projects, and instructor support with LabsICT Pro.

Explore Pro Courses

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.