Hive 在 Flutter 中的使用

序言

官方原话:Hive是为Flutter设计的。如果您需要一个轻量级的数据存储来支持您的应用,它非常合适。添加所需的依赖并初始化Hive后,您就可以在项目中使用Hive了

Hive 是一款用纯 Dart 编写的轻量级且极速的键值数据库,其灵感来源于 Bitcask。

其实简单的来说,上手简单

上链接官方库地址

特点

  • 跨平台:移动、桌面、浏览器
  • ⚡ 性能卓越(参见基准测试)
  • ❤️ 简单、强大、直观的应用程序接口
  • 内置强大的加密功能
  • 无本地依赖性

使用

第一步,先引入库

yaml 复制代码
dependencies: 
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies: 
  hive_generator: 2.0.1
  build_runner: 2.4.8 

接下来在main 里初始化

csharp 复制代码
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  Hive.registerAdapter(ContactAdapter());//实体方式保存
  await Hive.openBox(userBox);//直接键对值保存
  runApp(const MyApp());
}

疑问一:ContactAdapter 这个怎么来的呢? 先看图

我们在目录(这里为了测试,放在根目录了,建议是放置在数据目录)新建contact_page.dart

scala 复制代码
import 'package:hive/hive.dart';

part 'contact_page.g.dart';//一定要注意,跟实体名称一致

@HiveType(typeId: 0)
class Contact extends HiveObject {
  @HiveField(0)
  final String name;
  @HiveField(1)
  final int age;

  Contact({required this.name,required this.age});
}

接下来我们在命令窗口执行这串命令,会自动生成文件

arduino 复制代码
flutter packages pub run build_runner build --delete-conflicting-outputs

下面为主页demo的完整代码

scss 复制代码
```

const String userBox = "user_box"; //临时键值存储表
const String contactBox = "contact_box"; //实体数据表
class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _shoppingBox = Hive.box(userBox);

  int _counter = 0;
  List<Contact> contractLis = [];

  void _add() {
    _counter++;
    addData(_counter);
    _shoppingBox.put('key', '我是普通的键值');
    loadData();
  }

  @override
  void initState() {
    super.initState();
    loadData();
  }

  Future<void> addData(int index) async {
    var box = await Hive.openBox<Contact>(contactBox); // 存储数据
    var user = Contact(name: 'Johnny $index', age: index);
    await box.put('${DateTime.timestamp().millisecond}', user);
  }

  Future<void> loadData() async {
// 读取数据
    var box = await Hive.openBox<Contact>(contactBox); // 存储数据
    contractLis = box.values.toList();
    contractLis.sort((a, b) => b.age.compareTo(a.age));
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text("demo"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '简单存储',
            ),
            Text(
              _shoppingBox.get('key') ?? "暂无设置",
            ),
            const SizedBox(
              height: 12,
            ),
            const Text(
              '实体存储',
            ),
            ...contractLis
                .map((e) => Text(
                      e.name ?? "",
                    ))
                .toList(),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _add,
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

说明

final _shoppingBox = Hive.box(userBox); 可以不用在Future 调用,非常的舒服 但是要执行 openBox操作一定需要,切记

ini 复制代码
  var box = await Hive.openBox<Contact>(contactBox);  

首次编译成功后,本地会增加俩文件 user_box 和 contact_box,这俩文件是存储咋们的内容的文件

一起看看效果吧

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

相关推荐
恋猫de小郭20 分钟前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter
2501_9159090621 分钟前
怎么用 FlutterFlow 把应用发布到 App Store?
android·ios·小程序·https·uni-app·iphone·webview
峥嵘life22 分钟前
2026华为AI码道 CodeArts 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言·python
yxlalm1 小时前
对话记忆持久化-Redis热与MySQL冷
android·redis·mysql
1570925113410 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
终端安全笔记10 小时前
安卓五品牌通道差在哪:监管通道拆解
android
v_348360876211 小时前
Android native端 堆栈打印
android·算法
一笑的小酒馆12 小时前
AndroidKMP之导航和WebView
android
2501_9327502615 小时前
Android BottomNavigationView 入门介绍
android