Flutter如何使用shared_preferences插件
在Flutter项目中集成shared_preferences插件时遇到问题:按照官方文档添加依赖并同步后,调用SharedPreferences.getInstance()始终返回null。已确认AndroidManifest.xml中配置了正确权限,iOS端也添加了必要设置。尝试过flutter clean和重新安装插件仍无效。请问如何正确初始化shared_preferences?是否需要在main()中做异步处理?存储复杂对象时是否需要手动序列化?
2 回复
使用shared_preferences存储数据:
- 添加依赖:
flutter pub add shared_preferences - 导入包:
import 'package:shared_preferences/shared_preferences.dart'; - 使用:
- 保存:
prefs.setString('key', 'value') - 读取:
prefs.getString('key') - 删除:
prefs.remove('key')
- 保存:
记得用await调用异步方法。
更多关于Flutter如何使用shared_preferences插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用shared_preferences插件可以方便地在本地存储简单的键值对数据(如用户设置、登录状态等)。以下是详细步骤和示例代码:
1. 添加依赖
在 pubspec.yaml 文件中添加依赖:
dependencies:
shared_preferences: ^2.2.2
运行 flutter pub get 安装插件。
2. 基本用法
import 'package:shared_preferences/shared_preferences.dart';
// 保存数据
Future<void> saveData() async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', 'John'); // 存储字符串
await prefs.setInt('age', 25); // 存储整型
await prefs.setBool('isLoggedIn', true); // 存储布尔值
}
// 读取数据
Future<void> readData() async {
final prefs = await SharedPreferences.getInstance();
String? username = prefs.getString('username'); // 读取字符串
int? age = prefs.getInt('age'); // 读取整型
bool? isLoggedIn = prefs.getBool('isLoggedIn'); // 读取布尔值
print('用户名: $username, 年龄: $age, 登录状态: $isLoggedIn');
}
// 删除数据
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('username'); // 删除指定键
// await prefs.clear(); // 清空所有数据
}
3. 完整示例
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _username = '';
@override
void initState() {
super.initState();
_loadUsername();
}
_loadUsername() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_username = prefs.getString('username') ?? '未设置';
});
}
_updateUsername() async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', '李四');
_loadUsername(); // 重新加载显示
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
children: [
Text('当前用户: $_username'),
ElevatedButton(
onPressed: _updateUsername,
child: Text('更新用户名'),
),
],
),
),
);
}
}
注意事项:
- 异步操作:所有方法都是异步的,需使用
await或.then() - 空安全:读取数据时可能返回
null,建议使用??提供默认值 - 数据类型:支持
String、int、double、bool、StringList - 存储限制:不适合存储大量数据,大型数据建议使用数据库
通过以上方法即可快速实现轻量级本地数据存储功能。

