You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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初始化且打开了passwords Box

恢复功能核心代码

你可以搭配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:54:03