(flutter)Hive更新问题

cgh8pdjw  于 2023-11-18  发布在  Hive
关注(0)|答案(1)|浏览(190)

我创建了一个基本的应用程序,用于创建,删除,更新,和阅读员工详细信息,使用Flutter中的hive,更新函数不起作用,我通过更新函数传递类的对象,但它不起作用,我使用模型列表来存储数据。
这是Hive控制器的代码

  1. import 'package:hive_demo/model/emplyee_model.dart';
  2. import 'package:hive_flutter/hive_flutter.dart';
  3. class EmployeeController {
  4. static List<EmployeeModel> employeeList = [];
  5. var box = Hive.box('db');
  6. void initData() {
  7. employeeList = [
  8. EmployeeModel(name: 'name', designation: 'designation'),
  9. ];
  10. }
  11. void adddata(EmployeeModel employeeModel) async {
  12. employeeList.add(employeeModel);
  13. await box.put('employeedb', employeeList);
  14. }
  15. void getData() {
  16. List demoList = box.get('employeedb');
  17. employeeList = demoList
  18. .map((e) => EmployeeModel(name: e.name, designation: e.designation))
  19. .toList();
  20. }
  21. void deletedata(int index) async {
  22. employeeList.removeAt(index);
  23. await box.put('employeedb', employeeList);
  24. }
  25. void updateData(int id, EmployeeModel employeeModel) async {
  26. await box.putAt(id, employeeModel);
  27. getData();
  28. }
  29. }

字符串
这是主页的代码

  1. import 'package:flutter/material.dart';
  2. import 'package:hive/hive.dart';
  3. import 'package:hive_demo/controller/employee_controller.dart';
  4. import 'package:hive_demo/model/emplyee_model.dart';
  5. class Homepage extends StatefulWidget {
  6. const Homepage({super.key});
  7. @override
  8. State<Homepage> createState() => _HomepageState();
  9. }
  10. class _HomepageState extends State<Homepage> {
  11. TextEditingController nametextcontroller = TextEditingController();
  12. TextEditingController designationtextcontroller = TextEditingController();
  13. EmployeeController employeeController = EmployeeController();
  14. var box = Hive.box('db');
  15. @override
  16. void initState() {
  17. if (box.isNotEmpty) {
  18. employeeController.getData();
  19. } else {
  20. employeeController.initData();
  21. }
  22. super.initState();
  23. }
  24. @override
  25. Widget build(BuildContext context) {
  26. return Scaffold(
  27. appBar: AppBar(),
  28. body: Padding(
  29. padding: const EdgeInsets.all(8.0),
  30. child: Column(
  31. children: [
  32. TextField(
  33. controller: nametextcontroller,
  34. decoration: const InputDecoration(
  35. border: OutlineInputBorder(), hintText: 'name'),
  36. ),
  37. const SizedBox(
  38. height: 10,
  39. ),
  40. TextField(
  41. controller: designationtextcontroller,
  42. decoration: const InputDecoration(
  43. border: OutlineInputBorder(), hintText: 'designation'),
  44. ),
  45. ElevatedButton(
  46. onPressed: () {
  47. employeeController.adddata(EmployeeModel(
  48. name: nametextcontroller.text,
  49. designation: designationtextcontroller.text));
  50. setState(() {});
  51. },
  52. child: const Text('Add')),
  53. Expanded(
  54. child: ListView.separated(
  55. //list tile
  56. itemBuilder: (context, index) => ListTile(
  57. title:
  58. Text(EmployeeController.employeeList[index].name),
  59. subtitle: Text(
  60. EmployeeController.employeeList[index].designation),
  61. trailing: Row(
  62. mainAxisSize: MainAxisSize.min,
  63. children: [
  64. IconButton(
  65. onPressed: () {
  66. nametextcontroller.text = EmployeeController
  67. .employeeList[index].name;
  68. designationtextcontroller.text =
  69. EmployeeController
  70. .employeeList[index].designation;
  71. },
  72. icon: const Icon(Icons.edit)),
  73. IconButton(
  74. onPressed: () {
  75. employeeController.deletedata(index);
  76. setState(() {});
  77. },
  78. icon: const Icon(
  79. Icons.delete,
  80. color: Colors.red,
  81. )),
  82. IconButton(
  83. onPressed: () {
  84. employeeController.updateData(
  85. index,
  86. EmployeeModel(
  87. name: nametextcontroller.text,
  88. designation:
  89. designationtextcontroller.text));
  90. setState(() {});
  91. },
  92. icon: const Icon(Icons.refresh)),
  93. ],
  94. ),
  95. ),
  96. separatorBuilder: (context, index) => const Divider(
  97. height: 9,
  98. ),
  99. itemCount: EmployeeController.employeeList.length),
  100. )
  101. ],
  102. ),
  103. ),
  104. );
  105. }
  106. }


我该怎么解决呢?

yr9zkbsy

yr9zkbsy1#

Hive是一个非常快的数据库,它的主要目的是管理键/值数据,但是你可以使用TypeAdapters处理对象,也许你在其他文件中有这个定义,但我在共享的代码中看不到它。

无论如何,我会检查使用Hive时的两个常见错误:
1.确认盒子已打开:Hive.openBox('db');需要在var box = Hive.box('db');前添加openBox
1.如果你想处理对象而不是键/值,你必须注册一个TypeAdapter,它可以将对象从二进制形式转换为二进制形式。在文档页面中有一个很好的例子。
我通常做的是创建一个类来启动Hive。我称之为“本地化服务”:

  1. import 'package:hive_flutter/hive_flutter.dart';
  2. import 'package:path_provider/path_provider.dart';
  3. import 'package:hive_demo/model/employee_model.dart';
  4. class LocalStorageService {
  5. static Future<void> initLocalStorage() async {
  6. try {
  7. var dir = await getApplicationDocumentsDirectory();
  8. await Hive.initFlutter(dir.path);
  9. Hive.registerAdapter(EmployeeAdapter());
  10. await Hive.openBox('db');
  11. //initDefaults();
  12. } catch (e) {
  13. debugPrint("ERROR ON initLocalStorage(): ${e.toString()}");
  14. }
  15. }
  16. static void initDefaults() {
  17. // I use this function to run some validations and set default values
  18. }
  19. }

字符串
我从我的主.dart文件中的LocalWebService类调用initLocalStorage()方法:

  1. void main() async {
  2. WidgetsFlutterBinding.ensureInitialized();
  3. await LocalStorageService.initLocalStorage();
  4. runApp(MyApp());
  5. }

展开查看全部

相关问题