Flutter跨端开发之本地存储shared_preferences篇

62次阅读
没有评论

使用 shared_preferences 插件在 Flutter 中存储本地数据

shared_preferences 是 Flutter 中用于存储简单键值对数据的插件,它封装了 iOS 的 NSUserDefaults 和 Android 的 SharedPreferences,提供跨平台的本地存储解决方案。

安装

  1. pubspec.yaml 中添加依赖:
dependencies:
  shared_preferences: ^2.2.2
  1. 运行 flutter pub get

基本用法

  1. 导入包
import 'package:shared_preferences/shared_preferences.dart';
  1. 获取 SharedPreferences 实例
final prefs = await SharedPreferences.getInstance();
  1. 存储数据

支持的数据类型:
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']);
  1. 读取数据
// 读取整型,如果不存在返回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');
  1. 删除数据
// 删除单个键
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),
      ),
    );
  }
}

注意事项

  1. 异步操作:所有 SharedPreferences 操作都是异步的,需要使用 await.then()
  2. 数据大小限制:不适合存储大量数据,对于大数据应考虑使用其他存储方案如 SQLite 或文件存储。
  3. 数据类型:只能存储基本数据类型,不能直接存储复杂对象。
  4. 性能:频繁读写可能会影响性能,建议批量操作。
  5. 线程安全:SharedPreferences 实例是单例的,可以安全地在多个地方使用。
  6. 加密:默认不加密,敏感数据应考虑使用加密方案如 flutter_secure_storage

通过 shared_preferences,你可以轻松地在 Flutter 应用中实现简单的本地数据持久化功能。

正文完
 0
wujingquan
版权声明:本站原创文章,由 wujingquan 于2025-05-11发表,共计2859字。
转载说明:Unless otherwise specified, all articles are published by cc-4.0 protocol. Please indicate the source of reprint.
评论(没有评论)