如何使用JSON格式实现Flutter Hive数据的备份与恢复
基于Hive的密码管理器备份恢复实现方案
前置修改:补全模型类反序列化方法
你现有的Password模型类只实现了转JSON的toJson方法,首先需要新增反序列化的fromJson方法用于从JSON转换为Hive对象:
import 'package:hive/hive.dart'; part 'password.g.dart'; @HiveType(typeId: 0) class Password extends HiveObject { @HiveField(0) late String website; @HiveField(1) late String email; @HiveField(2) late String pd; Map<String, String> toJson() => { 'website': website, 'email': email, 'pd': pd, }; // 新增fromJson工厂方法 factory Password.fromJson(Map<String, dynamic> json) => Password() ..website = json['website'] as String ..email = json['email'] as String ..pd = json['pd'] as String; }
修改后重新运行build_runner生成Hive适配代码:flutter packages pub run build_runner build
实现恢复功能代码
前置要求
- 提前申请安卓存储读取权限,安卓13及以上版本需要申请读取公共目录文件的对应权限
- 确保恢复操作执行前,已经完成Hive初始化且打开了
passwordsBox
恢复功能核心代码
你可以搭配file_picker等文件选择库让用户选择指定的备份JSON文件,以下是恢复逻辑的核心实现:
import 'dart:convert'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:hive/hive.dart'; Future<void> restoreFromBackup() async { // 1. 让用户选择备份JSON文件 FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['json'], initialDirectory: '/storage/emulated/0/Passman/', ); if (result == null) { // 用户取消选择 return; } File backupFile = File(result.files.single.path!); try { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('正在恢复数据...')), ); // 2. 读取并解析备份文件 String jsonContent = await backupFile.readAsString(); Map<String, dynamic> backupMap = jsonDecode(jsonContent); // 3. 清空现有数据(如果不需要覆盖可以去掉这行,改为合并数据) await Hive.box<Password>('passwords').clear(); // 4. 遍历备份数据写入Hive for (var entry in backupMap.entries) { Password pwd = Password.fromJson(Map<String, dynamic>.from(entry.value)); // 可直接用原key,也可以自动生成新key await Hive.box<Password>('passwords').put(int.parse(entry.key), pwd); } ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('数据恢复成功')), ); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('恢复失败:${e.toString()}')), ); } }
注意事项
- 如果不需要覆盖现有数据,只需删除
clear()的调用即可实现新旧数据合并 - 目前备份文件是明文存储,涉及密码敏感数据建议后续增加AES等加密逻辑加密备份文件
- 跨设备迁移时,直接将备份文件传到新设备的Passman目录下,再执行恢复操作即可完成数据迁移
内容的提问来源于stack exchange,提问作者Priyansu Choudhury
相关产品推荐
相关产品推荐

