使用 shared_preferences 插件在 Flutter 中存储本地数据
shared_preferences
是 Flutter 中用于存储简单键值对数据的插件,它封装了 iOS 的 NSUserDefaults
和 Android 的 SharedPreferences
,提供跨平台的本地存储解决方案。
安装
- 在
pubspec.yaml
中添加依赖:
dependencies:
shared_preferences: ^2.2.2
- 运行
flutter pub get
基本用法
- 导入包
import 'package:shared_preferences/shared_preferences.dart';
- 获取 SharedPreferences 实例
final prefs = await SharedPreferences.getInstance();
- 存储数据
支持的数据类型:
• int
• double
• bool
• String
• List<String>
// 存储整型
await prefs.setInt('counter', 10);
// 存储布尔值
await prefs.setBool('isDarkMode', true);
// 存储字符串
await prefs.setString('username', 'JohnDoe');
// 存储字符串列表
await prefs.setStringList('favorites', ['apple', 'banana', 'orange']);
- 读取数据
// 读取整型,如果不存在返回0
int counter = prefs.getInt('counter') ?? 0;
// 读取布尔值,如果不存在返回false
bool isDarkMode = prefs.getBool('isDarkMode') ?? false;
// 读取字符串,如果不存在返回null
String? username = prefs.getString('username');
// 读取字符串列表,如果不存在返回null
List<String>? favorites = prefs.getStringList('favorites');
- 删除数据
// 删除单个键
await prefs.remove('username');
// 清空所有数据
await prefs.clear();
完整示例
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SharedPreferences Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const CounterPage(),
);
}
}
class CounterPage extends StatefulWidget {
const CounterPage({super.key});
@override
State<CounterPage> 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 = (prefs.getInt('counter') ?? 0) + 1;
prefs.setInt('counter', _counter);
});
}
// 重置计数器
Future<void> _resetCounter() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_counter = 0;
prefs.setInt('counter', _counter);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('SharedPreferences Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _resetCounter,
child: const Text('Reset Counter'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
注意事项
- 异步操作:所有 SharedPreferences 操作都是异步的,需要使用
await
或.then()
。 - 数据大小限制:不适合存储大量数据,对于大数据应考虑使用其他存储方案如 SQLite 或文件存储。
- 数据类型:只能存储基本数据类型,不能直接存储复杂对象。
- 性能:频繁读写可能会影响性能,建议批量操作。
- 线程安全:SharedPreferences 实例是单例的,可以安全地在多个地方使用。
- 加密:默认不加密,敏感数据应考虑使用加密方案如
flutter_secure_storage
。
通过 shared_preferences,你可以轻松地在 Flutter 应用中实现简单的本地数据持久化功能。
正文完