(颤振)Hive 更新问题

(flutter)Hive update issue

提问人:Nibin 提问时间:11/17/2023 最后编辑:Nibin 更新时间:11/17/2023 访问量:27

问:

我创建了一个基本的应用程序,用于在 Flutter 中使用 hive 创建、删除、更新和读取员工详细信息,并且更新函数不起作用,我正在通过更新函数传递类的对象,但它不起作用,我正在使用模型列表来存储数据。

这是 Hive 控制器的代码

import 'package:hive_demo/model/emplyee_model.dart';
import 'package:hive_flutter/hive_flutter.dart';

class EmployeeController {
  static List<EmployeeModel> employeeList = [];

  var box = Hive.box('db');

  void initData() {
    employeeList = [
      EmployeeModel(name: 'name', designation: 'designation'),
    ];
  }

  void adddata(EmployeeModel employeeModel) async {
    employeeList.add(employeeModel);
    await box.put('employeedb', employeeList);
  }

  void getData() {
    List demoList = box.get('employeedb');
    employeeList = demoList
        .map((e) => EmployeeModel(name: e.name, designation: e.designation))
        .toList();
  }

  void deletedata(int index) async {
    employeeList.removeAt(index);
    await box.put('employeedb', employeeList);
  }

  void updateData(int id, EmployeeModel employeeModel) async {
    await box.putAt(id, employeeModel);

    getData();
  }
}



这是主页的代码

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_demo/controller/employee_controller.dart';
import 'package:hive_demo/model/emplyee_model.dart';

class Homepage extends StatefulWidget {
  const Homepage({super.key});

  @override
  State<Homepage> createState() => _HomepageState();
}

class _HomepageState extends State<Homepage> {
  TextEditingController nametextcontroller = TextEditingController();
  TextEditingController designationtextcontroller = TextEditingController();
  EmployeeController employeeController = EmployeeController();

  var box = Hive.box('db');

  @override
  void initState() {
    if (box.isNotEmpty) {
      employeeController.getData();
    } else {
      employeeController.initData();
    }

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            TextField(
              controller: nametextcontroller,
              decoration: const InputDecoration(
                  border: OutlineInputBorder(), hintText: 'name'),
            ),
            const SizedBox(
              height: 10,
            ),
            TextField(
              controller: designationtextcontroller,
              decoration: const InputDecoration(
                  border: OutlineInputBorder(), hintText: 'designation'),
            ),
            ElevatedButton(
                onPressed: () {
                  employeeController.adddata(EmployeeModel(
                      name: nametextcontroller.text,
                      designation: designationtextcontroller.text));
                  setState(() {});
                },
                child: const Text('Add')),
            Expanded(
              child: ListView.separated(
                  //list tile
                  itemBuilder: (context, index) => ListTile(
                        title:
                            Text(EmployeeController.employeeList[index].name),
                        subtitle: Text(
                            EmployeeController.employeeList[index].designation),
                        trailing: Row(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            IconButton(
                                onPressed: () {
                                  nametextcontroller.text = EmployeeController
                                      .employeeList[index].name;
                                  designationtextcontroller.text =
                                      EmployeeController
                                          .employeeList[index].designation;
                                },
                                icon: const Icon(Icons.edit)),
                            IconButton(
                                onPressed: () {
                                  employeeController.deletedata(index);
                                  setState(() {});
                                },
                                icon: const Icon(
                                  Icons.delete,
                                  color: Colors.red,
                                )),
                            IconButton(
                                onPressed: () {
                                  employeeController.updateData(
                                      index,
                                      EmployeeModel(
                                          name: nametextcontroller.text,
                                          designation:
                                              designationtextcontroller.text));

                                  setState(() {});
                                },
                                icon: const Icon(Icons.refresh)),
                          ],
                        ),
                      ),
                  separatorBuilder: (context, index) => const Divider(
                        height: 9,
                      ),
                  itemCount: EmployeeController.employeeList.length),
            )
          ],
        ),
      ),
    );
  }
}

我该如何解决?

数据库 Flutter Dart Hive

评论


答:

1赞 vtisnado 11/17/2023 #1

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

无论如何,我会在使用 Hive 时检查两个常见错误:

  1. 确认盒子已打开:您需要在之前添加 openBoxHive.openBox('db');var box = Hive.box('db');
  2. 如果要处理对象而不是键/值,则必须注册一个 TypeAdapter,它将对象从二进制形式转换为二进制形式。文档页面中有一个很好的例子。

我通常做的是创建一个类来启动 Hive。我称之为“LocalStorageService”:

import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
import 'package:hive_demo/model/employee_model.dart';

class LocalStorageService {

    static Future<void> initLocalStorage() async {
        try {
            var dir = await getApplicationDocumentsDirectory();
            await Hive.initFlutter(dir.path);
            Hive.registerAdapter(EmployeeAdapter());
            
            await Hive.openBox('db');
            //initDefaults(); 

        } catch (e) {
            debugPrint("ERROR ON initLocalStorage(): ${e.toString()}");
        }
    }

    static void initDefaults() {
      // I use this function to run some validations and set default values
    }
}

我从main.dart文件中的LocalStorageService类调用该方法:initLocalStorage()

void main() async {
    WidgetsFlutterBinding.ensureInitialized();    
    await LocalStorageService.initLocalStorage();

    runApp(MyApp());

}