敲一遍,你会懂的
包:
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());
}