Flutter 本地持久化存储:Hive 与 SharedPreferences 实战对比

发布于:2025-09-02 ⋅ 阅读:(23) ⋅ 点赞:(0)

在移动应用开发中,本地持久化存储是必不可少的功能。无论是保存用户登录状态、应用配置,还是缓存数据,合理选择存储方案都能提高应用的性能与用户体验。

在 Flutter 中,常用的本地存储方式主要有两种:SharedPreferencesHive

本文将带你快速了解这两种方式的特点,并通过简单的 Demo 展示如何使用它们。


🔹 1. SharedPreferences

1.1 简介

SharedPreferences 是 Flutter 提供的轻量级存储方式,底层使用 Key-Value 形式存储,适合存储少量配置信息。

1.2 使用步骤

  1. 添加依赖

# pubspec.yaml
dependencies:
  shared_preferences: ^2.2.2
  1. 示例代码

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class SharedPreferencesDemo extends StatefulWidget {
  @override
  _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}

class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  String _username = "";

  Future<void> _saveData() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString("username", "FlutterUser");
    setState(() {
      _username = "FlutterUser";
    });
  }

  Future<void> _loadData() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _username = prefs.getString("username") ?? "暂无数据";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("SharedPreferences Demo")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("用户名:$_username"),
            ElevatedButton(
              onPressed: _saveData,
              child: Text("保存数据"),
            ),
            ElevatedButton(
              onPressed: _loadData,
              child: Text("读取数据"),
            ),
          ],
        ),
      ),
    );
  }
}

🔹 2. Hive

2.1 简介

Hive 是 Flutter 社区非常流行的 NoSQL 本地数据库,支持持久化存储、加密和复杂数据结构,性能优于 SharedPreferences

2.2 使用步骤

  1. 添加依赖

# pubspec.yaml
dependencies:
  hive: ^2.2.3
  hive_flutter: ^1.1.0

# 如果要存储复杂对象
# dev_dependencies:
#   hive_generator: ^2.0.1
#   build_runner: ^2.3.3
  1. 初始化 Hive

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  await Hive.openBox("settings");
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Hive Demo",
      home: HiveDemo(),
    );
  }
}

class HiveDemo extends StatefulWidget {
  @override
  _HiveDemoState createState() => _HiveDemoState();
}

class _HiveDemoState extends State<HiveDemo> {
  final box = Hive.box("settings");
  String _username = "暂无数据"; // 本地存储的用户名

  void _saveData() {
    box.put("username", "HiveUser");
    setState(() {
      _username = "HiveUser"; // 立即更新 UI
    });
  }

  void _loadData() {
    final value = box.get("username", defaultValue: "暂无数据");
    setState(() {
      _username = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Hive Demo")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("用户名:$_username"),
            ElevatedButton(
              onPressed: _saveData,
              child: Text("保存数据"),
            ),
            ElevatedButton(
              onPressed: _loadData,
              child: Text("读取数据"),
            ),
          ],
        ),
      ),
    );
  }
}

2.3 封装 HiveService(存储数组示例)

在实际项目中,为了方便调用,可以对 Hive 进行二次封装,例如存储数组:

import 'package:hive/hive.dart';

class HiveService {
  Future<void> saveArray(String key, List<dynamic> array) async {
    var box = await Hive.openBox('myBox');
    await box.put(key, array); // 保存数组
  }

  Future<List<dynamic>> getArray(String key) async {
    var box = await Hive.openBox('myBox');
    return box.get(key, defaultValue: []); // 获取数组,默认值为空列表
  }
}

这样,我们只需调用 HiveService().saveArray("users", ["张三", "李四"]) 即可保存数组,调用 HiveService().getArray("users") 即可获取,十分方便。


🔹 3. 对比总结

特性 SharedPreferences Hive
存储方式 Key-Value NoSQL 本地数据库
适用场景 配置项、布尔开关、少量数据 列表、对象、大量本地数据
性能 适合轻量存储 高性能,支持大规模数据存储
数据类型 基础类型(String/Int/Bool) 支持复杂对象和数组
易用性 简单易上手 初学需要配置,但功能更强大
加密支持 支持 AES 加密

结论

  • 如果只是存储登录状态或主题设置,用 SharedPreferences 就够了。

  • 如果需要存储数组、对象或大量数据,推荐使用 Hive,并可通过封装服务类提高代码复用性。


网站公告

今日签到

点亮在社区的每一天
去签到