如何使用Dart和Flutter开发应用并实现本地数据存储?
Flutter小店管理应用本地存储实现指南
存储方案选型
针对小店应用的商品、订单、会员等数据存储需求,推荐按照你的技术储备选择以下方案:
shared_preferences:官方维护的键值对存储插件,仅适合存轻量数据,比如店铺名称、默认打印设置、操作人账号这类小体量配置信息,不适合存储大量结构化业务数据- Hive(优先推荐):纯Dart实现的NoSQL本地数据库,无需编写SQL语句,配置门槛极低,读写性能优异,完全满足单店类应用的所有本地存储需求,对入门开发者非常友好
sqflite:SQLite的Flutter适配插件,适合有SQL基础、需要做多表关联查询的复杂场景,入门门槛高于Hive
项目启动落地思路
- 先梳理核心业务数据结构:把你需要存储的所有业务数据的字段列清楚,比如商品(名称、条码、进价、售价、库存、分类)、订单(创建时间、关联商品列表、应收金额、实收金额、备注)、会员(手机号、姓名、累计消费、余额)等,不用一开始就做全,先整理最核心的2-3类数据即可
- 优先跑通存储功能的最小demo:不用一开始就做完整的UI界面,先选Hive完成配置,跑通单类数据的增删改查逻辑,确认应用重启、设备关机重启后数据不会丢失,再做后续功能开发
- 提前补充数据备份逻辑:本地存储存在设备损坏、应用卸载数据丢失的风险,开发时提前加手动导出备份功能,可以把存储的数据导出为JSON文件存在设备公共下载目录,需要时可以导入恢复,避免经营数据丢失
- 功能迭代从小到大:先做最核心的商品录入、库存查询功能,再扩展订单记账、会员管理等功能,不要一开始就追求大而全
Hive极简上手代码示例
1. 引入依赖
在项目的pubspec.yaml文件中添加对应依赖:
dependencies: hive: ^2.2.3 hive_flutter: ^1.1.0 dev_dependencies: hive_generator: ^2.0.1 build_runner: ^2.4.6
执行flutter pub get安装依赖。
2. 定义数据实体类
以商品数据为例,新建product.dart文件:
import 'package:hive/hive.dart'; // 生成的适配文件,运行构建命令后自动生成 part 'product.g.dart'; // typeId每个实体类唯一,范围0-255 @HiveType(typeId: 0) class Product extends HiveObject { // HiveField的序号每个字段唯一,不要随意修改 @HiveField(0) late String name; @HiveField(1) late double sellingPrice; @HiveField(2) late int stock; }
在项目根目录执行命令flutter packages pub run build_runner build,自动生成实体类的适配代码。
3. 初始化Hive
修改项目的main.dart文件,完成初始化:
import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'product.dart'; void main() async { // 初始化Hive await Hive.initFlutter(); // 注册商品实体的适配器 Hive.registerAdapter(ProductAdapter()); // 打开商品存储的Box(可以理解为一个表) await Hive.openBox<Product>('productBox'); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('小店管理')), ), ); } }
4. 基础增删改查操作
// 获取商品存储Box final productBox = Hive.box<Product>('productBox'); // 新增商品 final newProduct = Product() ..name = '瓶装可乐' ..sellingPrice = 3.0 ..stock = 50; productBox.add(newProduct); // 查询所有商品 List<Product> allProducts = productBox.values.toList(); // 修改指定位置的商品库存 final product = productBox.getAt(0); product?.stock = 49; product?.save(); // 删除指定位置的商品 productBox.deleteAt(0);
内容的提问来源于stack exchange,提问作者flu tter 87
相关产品推荐
相关产品推荐

