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 秒钟,对我来说是一个激励,感谢。

相关推荐
李堇6 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly7 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者810 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码203510 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥11 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓11 小时前
[JDBC]元数据
android
独行soc11 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能11 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿11 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc12 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮