Flutter local storage
This section will introduce local storage solutions in Flutter, including SharedPreferences, file storage, and SQLite databases.
SharedPreferences - lightweight storage
SharedPreferences is suitable for storing simple key-value pair data.
Add dependency
dependencies: shared_preferences: ^2.0.0
Example: SharedPreferences Usage
import 'package:shared_preferences/shared_preferences.dart';
// Save data
Future<void> saveData() async {
final prefs = await SharedPreferences.getInstance();
// Save string
await prefs.setString('username', 'Zhang San');
// Save integer
await prefs.setInt('age', 25);
// Save boolean
await prefs.setBool('isLoggedIn', true);
// Save list (JSON string)
await prefs.setStringList('tags', ['flutter', 'dart']);
}
// Read data
Future<void> loadData() async {
final prefs = await SharedPreferences.getInstance();
final username = prefs.getString('username') ?? '';
final age = prefs.getInt('age') ?? 0;
final isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
final tags = prefs.getStringList('tags') ?? [];
print('Username: $username');
print('Age: $age');
print('Logged in: $isLoggedIn');
print('Tags: $tags');
}
// Delete data
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
// Delete single
await prefs.remove('username');
// Delete all
await prefs.clear();
}
// Save data
Future<void> saveData() async {
final prefs = await SharedPreferences.getInstance();
// Save string
await prefs.setString('username', 'Zhang San');
// Save integer
await prefs.setInt('age', 25);
// Save boolean
await prefs.setBool('isLoggedIn', true);
// Save list (JSON string)
await prefs.setStringList('tags', ['flutter', 'dart']);
}
// Read data
Future<void> loadData() async {
final prefs = await SharedPreferences.getInstance();
final username = prefs.getString('username') ?? '';
final age = prefs.getInt('age') ?? 0;
final isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
final tags = prefs.getStringList('tags') ?? [];
print('Username: $username');
print('Age: $age');
print('Logged in: $isLoggedIn');
print('Tags: $tags');
}
// Delete data
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
// Delete single
await prefs.remove('username');
// Delete all
await prefs.clear();
}
File Storage
Use path_provider to get the app document directory for file storage.
Add dependency
dependencies: path_provider: ^2.0.0
Example: File Read/Write
import 'dart:io';
import 'package:path_provider/path_provider.dart';
// Get documents directory
Future<Directory> get _documentDirectory async {
return await getApplicationDocumentsDirectory();
}
// Write file
Future<void> writeFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
// Write text
await file.writeAsString('Hello Flutter!');
// Write bytes
final bytes = [72, 101, 108, 108, 111]; // "Hello"
await file.writeAsBytes(bytes);
}
// Read file
Future<void> readFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
if (await file.exists()) {
// Read text
final content = await file.readAsString();
print('File content: $content');
// Read bytes
final bytes = await file.readAsBytes();
print('Bytes: $bytes');
}
}
// JSON file storage
Future<void> saveJson() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/data.json');
final data = {
'name': 'Zhang San',
'age': 25,
'skills': ['Flutter', 'Dart'],
};
// Use jsonEncode to save JSON
await file.writeAsString(jsonEncode(data));
}
import 'package:path_provider/path_provider.dart';
// Get documents directory
Future<Directory> get _documentDirectory async {
return await getApplicationDocumentsDirectory();
}
// Write file
Future<void> writeFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
// Write text
await file.writeAsString('Hello Flutter!');
// Write bytes
final bytes = [72, 101, 108, 108, 111]; // "Hello"
await file.writeAsBytes(bytes);
}
// Read file
Future<void> readFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
if (await file.exists()) {
// Read text
final content = await file.readAsString();
print('File content: $content');
// Read bytes
final bytes = await file.readAsBytes();
print('Bytes: $bytes');
}
}
// JSON file storage
Future<void> saveJson() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/data.json');
final data = {
'name': 'Zhang San',
'age': 25,
'skills': ['Flutter', 'Dart'],
};
// Use jsonEncode to save JSON
await file.writeAsString(jsonEncode(data));
}
SQLite Database
Use sqflite for SQLite database operations.
Add dependency
dependencies: sqflite: ^2.0.0 path: ^1.8.0
Example: SQLite Basic Operations
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
// Database helper class
class DatabaseHelper {
static final DatabaseHelper instance = DatabaseHelper._init();
static Database? _database;
DatabaseHelper._init();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB('my_app.db');
return _database!;
}
// Initialize database
Future<Database> _initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return await openDatabase(
path,
version: 1,
onCreate: _createDB,
);
}
// Create table
Future<void> _createDB(Database db, int version) async {
await db.execute('''
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
age INTEGER
)
''');
}
// Insert data
Future<int> insertUser(Map<String, dynamic> user) async {
final db = await database;
return await db.insert('users', user);
}
// Query all users
Future<List<Map<String, dynamic>>> getAllUsers() async {
final db = await database;
return await db.query('users');
}
// Conditional query
Future<List<Map<String, dynamic>>> getUserByName(String name) async {
final db = await database;
return await db.query(
'users',
where: 'name = ?',
whereArgs: [name],
);
}
// Update data
Future<int> updateUser(int id, Map<String, dynamic> user) async {
final db = await database;
return await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [id],
);
}
// Delete data
Future<int> deleteUser(int id) async {
final db = await database;
return await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
// Close database
Future<void> close() async {
final db = await database;
db.close();
}
}
// Usage example
Future<void> dbExample() async {
final db = DatabaseHelper.instance;
// Add user
await db.insertUser({
'name': 'Zhang San',
'email': 'zhangsan@example.com',
'age': 25,
});
// Query all
final users = await db.getAllUsers();
print('User list: $users');
// Update user
await db.updateUser(1, {'name': 'Li Si', 'age': 30});
// Delete user
await db.deleteUser(1);
}
import 'package:path/path.dart';
// Database helper class
class DatabaseHelper {
static final DatabaseHelper instance = DatabaseHelper._init();
static Database? _database;
DatabaseHelper._init();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB('my_app.db');
return _database!;
}
// Initialize database
Future<Database> _initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return await openDatabase(
path,
version: 1,
onCreate: _createDB,
);
}
// Create table
Future<void> _createDB(Database db, int version) async {
await db.execute('''
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
age INTEGER
)
''');
}
// Insert data
Future<int> insertUser(Map<String, dynamic> user) async {
final db = await database;
return await db.insert('users', user);
}
// Query all users
Future<List<Map<String, dynamic>>> getAllUsers() async {
final db = await database;
return await db.query('users');
}
// Conditional query
Future<List<Map<String, dynamic>>> getUserByName(String name) async {
final db = await database;
return await db.query(
'users',
where: 'name = ?',
whereArgs: [name],
);
}
// Update data
Future<int> updateUser(int id, Map<String, dynamic> user) async {
final db = await database;
return await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [id],
);
}
// Delete data
Future<int> deleteUser(int id) async {
final db = await database;
return await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
// Close database
Future<void> close() async {
final db = await database;
db.close();
}
}
// Usage example
Future<void> dbExample() async {
final db = DatabaseHelper.instance;
// Add user
await db.insertUser({
'name': 'Zhang San',
'email': 'zhangsan@example.com',
'age': 25,
});
// Query all
final users = await db.getAllUsers();
print('User list: $users');
// Update user
await db.updateUser(1, {'name': 'Li Si', 'age': 30});
// Delete user
await db.deleteUser(1);
}
other extensionsData storage solution selection: use SharedPreferences for simple key-value pairs, SQLite for complex structures, and file storage is suitable for large files.