flutter hive使用(复杂类)

打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3025

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
敲一遍,你会懂的
包:
  1. dependencies:
  2.   flutter:
  3.     sdk: flutter
  4.   cupertino_icons: ^1.0.8
  5.   hive: ^2.2.3
  6.   hive_flutter: ^1.1.0
  7. dev_dependencies:
  8.   flutter_test:
  9.     sdk: flutter
  10.   hive_generator: ^2.0.1
  11.   build_runner: ^2.4.7
复制代码
类:(config.dart)
  1. import 'package:hive/hive.dart';
  2. part 'config.g.dart'; // 生成的文件
  3. @HiveType(typeId: 0)
  4. class Config extends HiveObject {
  5.   @HiveField(0)
  6.   String language;
  7.   @HiveField(1)
  8.   String theme;
  9.   @HiveField(2)
  10.   List<LanguageConfig> languages;
  11.   Config({required this.language, required this.theme, required this.languages});
  12. }
  13. @HiveType(typeId: 1)
  14. class LanguageConfig extends HiveObject {
  15.   @HiveField(0)
  16.   String language;
  17.   @HiveField(1)
  18.   String filePath;
  19.   @HiveField(2)
  20.   bool willTranslate;
  21.   LanguageConfig({required this.language, required this.filePath, required this.willTranslate});
  22. }
复制代码
生成代码:
  1. flutter packages pub run build_runner build
复制代码
服务类:(hive_service.dart)
  1. import 'package:hive/hive.dart';
  2. import 'config.dart';
  3. class HiveService {
  4.   static const String configBoxName = 'configBox';
  5.   // 打开 Box
  6.   static Future<Box<Config>> openBox() async {
  7.     return await Hive.openBox<Config>(configBoxName);
  8.   }
  9.   // 保存配置
  10.   static Future<void> saveConfig(Config config) async {
  11.     final box = await openBox();
  12.     await box.put('config', config);
  13.   }
  14.   // 获取配置
  15.   static Future<Config?> getConfig() async {
  16.     final box = await openBox();
  17.     return box.get('config');
  18.   }
  19. }
复制代码
uiapp.dart)
  1. import 'package:flutter/material.dart';
  2. import 'hive_service.dart';
  3. import 'config.dart';
  4. class MyApp extends StatelessWidget {
  5.   @override
  6.   Widget build(BuildContext context) {
  7.     return MaterialApp(
  8.       home: ConfigScreen(),
  9.     );
  10.   }
  11. }
  12. class ConfigScreen extends StatefulWidget {
  13.   @override
  14.   _ConfigScreenState createState() => _ConfigScreenState();
  15. }
  16. class _ConfigScreenState extends State<ConfigScreen> {
  17.   Config? config;
  18.   @override
  19.   void initState() {
  20.     super.initState();
  21.     _loadConfig();
  22.   }
  23.   Future<void> _loadConfig() async {
  24.     Config? savedConfig = await HiveService.getConfig();
  25.     setState(() {
  26.       config = savedConfig ??
  27.           Config(language: "en", theme: "light", languages: [
  28.             LanguageConfig(language: "English", filePath: "/path/en", willTranslate: true),
  29.             LanguageConfig(language: "Chinese", filePath: "/path/zh", willTranslate: false),
  30.           ]);
  31.     });
  32.   }
  33.   Future<void> _saveConfig() async {
  34.     if (config != null) {
  35.       await HiveService.saveConfig(config!);
  36.       ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("配置已保存")));
  37.     }
  38.   }
  39.   @override
  40.   Widget build(BuildContext context) {
  41.     return Scaffold(
  42.       appBar: AppBar(title: Text("Hive 配置存储 Demo")),
  43.       body: config == null
  44.           ? Center(child: CircularProgressIndicator())
  45.           : Column(
  46.         children: [
  47.           ListTile(
  48.             title: Text("当前语言: ${config!.language}"),
  49.             trailing: DropdownButton<String>(
  50.               value: config!.language,
  51.               items: ["en", "zh"].map((lang) {
  52.                 return DropdownMenuItem(value: lang, child: Text(lang));
  53.               }).toList(),
  54.               onChanged: (val) {
  55.                 setState(() {
  56.                   config!.language = val!;
  57.                 });
  58.               },
  59.             ),
  60.           ),
  61.           ListTile(
  62.             title: Text("当前主题: ${config!.theme}"),
  63.             trailing: DropdownButton<String>(
  64.               value: config!.theme,
  65.               items: ["light", "dark"].map((theme) {
  66.                 return DropdownMenuItem(value: theme, child: Text(theme));
  67.               }).toList(),
  68.               onChanged: (val) {
  69.                 setState(() {
  70.                   config!.theme = val!;
  71.                 });
  72.               },
  73.             ),
  74.           ),
  75.           ElevatedButton(
  76.             onPressed: _saveConfig,
  77.             child: Text("保存配置"),
  78.           ),
  79.         ],
  80.       ),
  81.     );
  82.   }
  83. }
复制代码
入口:(main.dart)
  1. import 'package:flutter/material.dart';
  2. import 'package:hive_flutter/hive_flutter.dart';
  3. import 'app.dart';
  4. import 'config.dart';
  5. void main() async {
  6.   WidgetsFlutterBinding.ensureInitialized();
  7.   // 初始化 Hive
  8.   await Hive.initFlutter();
  9.   // 注册适配器
  10.   Hive.registerAdapter(ConfigAdapter());
  11.   Hive.registerAdapter(LanguageConfigAdapter());
  12.   runApp(MyApp());
  13. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表