使用 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 应用中实现简单的本地数据持久化功能。
正文完