当前位置: 首页 > article >正文

flutter hive使用(复杂类)

敲一遍,你会懂的

包:

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  hive: ^2.2.3
  hive_flutter: ^1.1.0


dev_dependencies:
  flutter_test:
    sdk: flutter
  hive_generator: ^2.0.1
  build_runner: ^2.4.7

类:(config.dart)

import 'package:hive/hive.dart';

part 'config.g.dart'; // 生成的文件

@HiveType(typeId: 0)
class Config extends HiveObject {
  @HiveField(0)
  String language;

  @HiveField(1)
  String theme;

  @HiveField(2)
  List<LanguageConfig> languages;

  Config({required this.language, required this.theme, required this.languages});
}

@HiveType(typeId: 1)
class LanguageConfig extends HiveObject {
  @HiveField(0)
  String language;

  @HiveField(1)
  String filePath;

  @HiveField(2)
  bool willTranslate;

  LanguageConfig({required this.language, required this.filePath, required this.willTranslate});
}

生成代码:

flutter packages pub run build_runner build

服务类:(hive_service.dart)

import 'package:hive/hive.dart';
import 'config.dart';

class HiveService {
  static const String configBoxName = 'configBox';

  // 打开 Box
  static Future<Box<Config>> openBox() async {
    return await Hive.openBox<Config>(configBoxName);
  }

  // 保存配置
  static Future<void> saveConfig(Config config) async {
    final box = await openBox();
    await box.put('config', config);
  }

  // 获取配置
  static Future<Config?> getConfig() async {
    final box = await openBox();
    return box.get('config');
  }
}

ui:(app.dart)

import 'package:flutter/material.dart';
import 'hive_service.dart';
import 'config.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ConfigScreen(),
    );
  }
}

class ConfigScreen extends StatefulWidget {
  @override
  _ConfigScreenState createState() => _ConfigScreenState();
}

class _ConfigScreenState extends State<ConfigScreen> {
  Config? config;

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

  Future<void> _loadConfig() async {
    Config? savedConfig = await HiveService.getConfig();
    setState(() {
      config = savedConfig ??
          Config(language: "en", theme: "light", languages: [
            LanguageConfig(language: "English", filePath: "/path/en", willTranslate: true),
            LanguageConfig(language: "Chinese", filePath: "/path/zh", willTranslate: false),
          ]);
    });
  }

  Future<void> _saveConfig() async {
    if (config != null) {
      await HiveService.saveConfig(config!);
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("配置已保存")));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Hive 配置存储 Demo")),
      body: config == null
          ? Center(child: CircularProgressIndicator())
          : Column(
        children: [
          ListTile(
            title: Text("当前语言: ${config!.language}"),
            trailing: DropdownButton<String>(
              value: config!.language,
              items: ["en", "zh"].map((lang) {
                return DropdownMenuItem(value: lang, child: Text(lang));
              }).toList(),
              onChanged: (val) {
                setState(() {
                  config!.language = val!;
                });
              },
            ),
          ),
          ListTile(
            title: Text("当前主题: ${config!.theme}"),
            trailing: DropdownButton<String>(
              value: config!.theme,
              items: ["light", "dark"].map((theme) {
                return DropdownMenuItem(value: theme, child: Text(theme));
              }).toList(),
              onChanged: (val) {
                setState(() {
                  config!.theme = val!;
                });
              },
            ),
          ),
          ElevatedButton(
            onPressed: _saveConfig,
            child: Text("保存配置"),
          ),
        ],
      ),
    );
  }
}

入口:(main.dart)

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'app.dart';
import 'config.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 Hive
  await Hive.initFlutter();

  // 注册适配器
  Hive.registerAdapter(ConfigAdapter());
  Hive.registerAdapter(LanguageConfigAdapter());

  runApp(MyApp());
}


http://www.kler.cn/a/546048.html

相关文章:

  • [qt5学习笔记]用vs2022(msvc2017)+copilot进行QtWidgetsApplication源码解析
  • ECCV2022 | LGV | LGV:利用大几何邻域提升对抗样本的可迁移性
  • MySQL中rank()、row_number()、dense_rank()排序
  • 【Elasticsearch】运行时字段(Runtime Fields)索引时定义运行时字段
  • CES Asia 2025:构建长效价值运营体系,赋能科技产业新发展
  • 游戏引擎学习第103天
  • 利用prompt技术结合大模型对目标B/S架构软件系统进行测试
  • docker 的使用
  • 第6章 6.4 ASP.NET Core Web API各种技术及选择
  • 常用共轭先验分布
  • DeepSeek 概述与本地化部署【详细流程】
  • Spring Cache 详细讲解
  • 国产化替代大势所趋,ARM工控机的未来之路
  • 二级C语言题解:函数指针的操作、单链表偶数结点值累加、判断回文
  • ES的java操作
  • 20240911 光迅科技 笔试
  • QT设备树,具有设备树过滤功能
  • MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制
  • 【Map vs Set】:Java数据存储的“双子星”对决
  • foobar2000设置DSP使用教程及软件推荐