Flutter如何使用shared_preferences插件

在Flutter项目中集成shared_preferences插件时遇到问题:按照官方文档添加依赖并同步后,调用SharedPreferences.getInstance()始终返回null。已确认AndroidManifest.xml中配置了正确权限,iOS端也添加了必要设置。尝试过flutter clean和重新安装插件仍无效。请问如何正确初始化shared_preferences?是否需要在main()中做异步处理?存储复杂对象时是否需要手动序列化?

2 回复

使用shared_preferences存储数据:

  1. 添加依赖:flutter pub add shared_preferences
  2. 导入包:import 'package:shared_preferences/shared_preferences.dart';
  3. 使用:
    • 保存: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('更新用户名'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项:

  1. 异步操作:所有方法都是异步的,需使用 await.then()
  2. 空安全:读取数据时可能返回 null,建议使用 ?? 提供默认值
  3. 数据类型:支持 StringintdoubleboolStringList
  4. 存储限制:不适合存储大量数据,大型数据建议使用数据库

通过以上方法即可快速实现轻量级本地数据存储功能。

回到顶部